]> git.saurik.com Git - wxWidgets.git/commitdiff
Trying to understand wxCanvas.
authorRobert Roebling <robert@roebling.de>
Fri, 24 Nov 2000 20:19:39 +0000 (20:19 +0000)
committerRobert Roebling <robert@roebling.de>
Fri, 24 Nov 2000 20:19:39 +0000 (20:19 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8812 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

21 files changed:
contrib/configure
contrib/configure.in
contrib/include/wx/canvas/bbox.h
contrib/samples/canvas/Makefile.in
contrib/samples/canvas/simple/Makefile.in [new file with mode: 0644]
contrib/samples/canvas/simple/mondrian.ico [new file with mode: 0644]
contrib/samples/canvas/simple/mondrian.xpm [new file with mode: 0644]
contrib/samples/canvas/simple/simple.cpp [new file with mode: 0644]
contrib/samples/canvas/simple/simple.h [new file with mode: 0644]
contrib/samples/canvas/simple/simple.rc [new file with mode: 0644]
contrib/samples/canvas/simple/simple.wdr [new file with mode: 0644]
contrib/samples/canvas/simple/smile.xpm [new file with mode: 0644]
contrib/samples/canvas/test/Makefile.in
contrib/samples/canvas/test/pat36.bmp [new file with mode: 0644]
contrib/samples/canvas/test/pat4.bmp [new file with mode: 0644]
contrib/samples/canvas/test/test.cpp
contrib/samples/canvas/test/test.h [new file with mode: 0644]
contrib/src/canvas/bbox.cpp
contrib/src/canvas/canvas.cpp
contrib/src/canvas/liner.cpp
contrib/src/canvas/polygon.cpp

index 4cf145f63920b16d992d525f15f1223e3ed294ca..d3786f6abc9793026a7b13694148e3064a7038c3 100755 (executable)
@@ -828,12 +828,15 @@ trap 'rm -fr `echo "
             samples/stc/Makefile
             samples/canvas/Makefile
             samples/canvas/test/Makefile
+            samples/canvas/simple/Makefile
             samples/gizmos/Makefile
             samples/gizmos/multicell/Makefile
             samples/gizmos/splittree/Makefile
+            samples/xml/Makefile
             utils/Makefile
             utils/wxrc/Makefile
             utils/wxrcedit/Makefile
+            utils/convertrc/Makefile
          " | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
 EOF
 cat >> $CONFIG_STATUS <<EOF
@@ -928,12 +931,15 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
             samples/stc/Makefile
             samples/canvas/Makefile
             samples/canvas/test/Makefile
+            samples/canvas/simple/Makefile
             samples/gizmos/Makefile
             samples/gizmos/multicell/Makefile
             samples/gizmos/splittree/Makefile
+            samples/xml/Makefile
             utils/Makefile
             utils/wxrc/Makefile
             utils/wxrcedit/Makefile
+            utils/convertrc/Makefile
          "}
 EOF
 cat >> $CONFIG_STATUS <<\EOF
index b9f770db7e1aec9eca8c0b83f864fdb1e525a704..d8bee0cfe2862880c94484a95c1a3f6e53f3c8fe 100644 (file)
@@ -53,6 +53,7 @@ AC_OUTPUT([
             samples/stc/Makefile
             samples/canvas/Makefile
             samples/canvas/test/Makefile
+            samples/canvas/simple/Makefile
             samples/gizmos/Makefile
             samples/gizmos/multicell/Makefile
             samples/gizmos/splittree/Makefile
index ef725e9eacb0d4969dea277503f43b5fbe018acb..b47c9e3af6afb532ff0b593ac0e0c58daf698317 100644 (file)
@@ -9,7 +9,7 @@
     #include "wx/wx.h"
 #endif
 
-#include "wxmatrix.h"
+#include "wx/matrix.h"
 #include "wx/geometry.h"
 
 enum OVERLAP {_IN,_ON,_OUT};
index bde66ce1eeac435a64e6f3c8be1b988fc4db4d71..8eb2e333c7384f6ec727c099e01fb309b488fd88 100644 (file)
@@ -1,6 +1,6 @@
 # $Id$
 
-CONTRIB_SAMPLES=test
+CONTRIB_SAMPLES=test simple
 
 all:
        @for d in $(CONTRIB_SAMPLES); do (cd $$d && $(MAKE)); done
diff --git a/contrib/samples/canvas/simple/Makefile.in b/contrib/samples/canvas/simple/Makefile.in
new file mode 100644 (file)
index 0000000..1618e56
--- /dev/null
@@ -0,0 +1,23 @@
+#
+# File:                Makefile.in
+# Author:      Julian Smart
+# Created:     2000
+# Updated:     
+# Copyright:   (c) 2000 Julian Smart
+#
+# "%W% %G%"
+#
+# Makefile for the multicell example (UNIX).
+
+top_srcdir = @top_srcdir@/..
+top_builddir = ../../../..
+program_dir = contrib/samples/canvas/simple
+
+PROGRAM=simple
+
+OBJECTS=simple.o
+
+APPEXTRALIBS=$(top_builddir)/lib/libcanvas.@WX_TARGET_LIBRARY_TYPE@
+APPEXTRADEFS=-I$(top_srcdir)/contrib/include
+
+include $(top_builddir)/src/makeprog.env
diff --git a/contrib/samples/canvas/simple/mondrian.ico b/contrib/samples/canvas/simple/mondrian.ico
new file mode 100644 (file)
index 0000000..2310c5d
Binary files /dev/null and b/contrib/samples/canvas/simple/mondrian.ico differ
diff --git a/contrib/samples/canvas/simple/mondrian.xpm b/contrib/samples/canvas/simple/mondrian.xpm
new file mode 100644 (file)
index 0000000..409f27a
--- /dev/null
@@ -0,0 +1,44 @@
+/* XPM */
+static char *mondrian_xpm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 6 1",
+"  c Black",
+". c Blue",
+"X c #00bf00",
+"o c Red",
+"O c Yellow",
+"+ c Gray100",
+/* pixels */
+"                                ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+" oooooo +++++++++++++++++++++++ ",
+"                                ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++ .... ",
+" ++++++ ++++++++++++++++++      ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++ ++++++++++++++++++ ++++ ",
+" ++++++                    ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
+"                                "
+};
diff --git a/contrib/samples/canvas/simple/simple.cpp b/contrib/samples/canvas/simple/simple.cpp
new file mode 100644 (file)
index 0000000..796339e
--- /dev/null
@@ -0,0 +1,147 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        simple.cpp
+// Author:      XX
+// Created:     XX/XX/XX
+// Copyright:   
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+    #pragma implementation "simple.cpp"
+#endif
+
+// For compilers that support precompilation
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+    #pragma hdrstop
+#endif
+
+// Include private headers
+#include "simple.h"
+
+// Include icon header
+#if defined(__WXGTK__) || defined(__WXMOTIF__)
+    #include "mondrian.xpm"
+#endif
+
+// Include image
+#include "smile.xpm"
+    
+// WDR: class implementations
+
+//------------------------------------------------------------------------------
+// MyFrame
+//------------------------------------------------------------------------------
+
+// WDR: event table for MyFrame
+
+BEGIN_EVENT_TABLE(MyFrame,wxFrame)
+    EVT_MENU(ID_QUIT, MyFrame::OnQuit)
+    EVT_CLOSE(MyFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+MyFrame::MyFrame( wxWindow *parent, wxWindowID id, const wxString &title,
+    const wxPoint &position, const wxSize& size, long style ) :
+    wxFrame( parent, id, title, position, size, style )
+{
+    CreateMyMenuBar();
+    
+    CreateStatusBar(1);
+    SetStatusText( "Welcome!" );
+    
+    SetIcon(wxICON(mondrian));
+
+    // wxCanvas from here
+    
+    m_admin = new wxCanvasAdmin;
+    wxCanvas *canvas = new wxCanvas( m_admin, this, -1 );
+    m_admin->Append( canvas );
+    m_admin->SetActive( canvas );
+    
+
+    wxCanvasObjectGroup *root = new wxCanvasObjectGroup(0,0);
+    root->DeleteContents( TRUE );
+
+    wxCanvasRect *rect;
+    
+    rect = new wxCanvasRect( 120,10,120,140 );
+    rect->SetBrush( *wxRED_BRUSH );
+    root->Append( rect );
+        
+/*
+    wxBitmap bitmap( smile_xpm );
+    wxImage image( bitmap );
+
+    m_smile1 = new wxCanvasImage( image, 0,70,32,32 );
+    root->Append( m_smile1 );
+
+    int i;
+    for (i = 10; i < 300; i+=10)
+    {
+        wxCanvasRect *r = new wxCanvasRect( i,50,3,140 );
+        r->SetBrush( *wxRED_BRUSH );
+        root->Append( r );
+    }
+    
+    m_smile2 = new wxCanvasImage( image, 0,110,32,32 );
+    root->Append( m_smile2 );
+
+    for (i = 15; i < 300; i+=10)
+    {
+        wxCanvasRect *r = new wxCanvasRect( i,50,3,140 );
+        r->SetBrush( *wxRED_BRUSH );
+        root->Append( r );
+    }
+*/
+    
+    canvas->SetRoot( root );
+}
+
+void MyFrame::CreateMyMenuBar()
+{
+    wxMenu *file_menu = new wxMenu;
+    file_menu->Append( ID_QUIT, "Quit...", "Quit program" );
+    
+    wxMenuBar *menu_bar = new wxMenuBar();
+    menu_bar->Append( file_menu, "File" );
+    
+    SetMenuBar( menu_bar );
+}
+
+// WDR: handler implementations for MyFrame
+
+void MyFrame::OnQuit( wxCommandEvent &event )
+{
+     Close( TRUE );
+}
+
+void MyFrame::OnCloseWindow( wxCloseEvent &event )
+{
+    // if ! saved changes -> return
+    
+    Destroy();
+}
+
+//------------------------------------------------------------------------------
+// MyApp
+//------------------------------------------------------------------------------
+
+IMPLEMENT_APP(MyApp)
+
+MyApp::MyApp()
+{
+}
+
+bool MyApp::OnInit()
+{
+    MyFrame *frame = new MyFrame( NULL, -1, "SuperApp", wxPoint(20,20), wxSize(500,340) );
+    frame->Show( TRUE );
+    
+    return TRUE;
+}
+
+int MyApp::OnExit()
+{
+    return 0;
+}
+
diff --git a/contrib/samples/canvas/simple/simple.h b/contrib/samples/canvas/simple/simple.h
new file mode 100644 (file)
index 0000000..ab9e6ff
--- /dev/null
@@ -0,0 +1,76 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        simple.h
+// Author:      XX
+// Created:     XX/XX/XX
+// Copyright:   
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __simple_H__
+#define __simple_H__
+
+#ifdef __GNUG__
+    #pragma interface "simple.cpp"
+#endif
+
+// Include wxWindows' headers
+
+#ifndef WX_PRECOMP
+    #include <wx/wx.h>
+#endif
+
+#include "wx/canvas/canvas.h"
+
+//----------------------------------------------------------------------------
+//   constants
+//----------------------------------------------------------------------------
+
+#define ID_QUIT     101
+
+// WDR: class declarations
+
+//----------------------------------------------------------------------------
+// MyFrame
+//----------------------------------------------------------------------------
+
+class MyFrame: public wxFrame
+{
+public:
+    // constructors and destructors
+    MyFrame( wxWindow *parent, wxWindowID id, const wxString &title,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = wxDEFAULT_FRAME_STYLE );
+    
+private:
+    // WDR: method declarations for MyFrame
+    void CreateMyMenuBar();
+    
+private:
+    // WDR: member variable declarations for MyFrame
+    wxCanvasImage    *m_smile1;
+    wxCanvasImage    *m_smile2;
+    wxCanvasAdmin    *m_admin;
+    
+private:
+    // WDR: handler declarations for MyFrame
+    void OnQuit( wxCommandEvent &event );
+    void OnCloseWindow( wxCloseEvent &event );
+    
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+//----------------------------------------------------------------------------
+// MyApp
+//----------------------------------------------------------------------------
+
+class MyApp: public wxApp
+{
+public:
+    MyApp();
+    
+    virtual bool OnInit();
+    virtual int OnExit();
+};
+
+#endif
diff --git a/contrib/samples/canvas/simple/simple.rc b/contrib/samples/canvas/simple/simple.rc
new file mode 100644 (file)
index 0000000..878f335
--- /dev/null
@@ -0,0 +1,3 @@
+#include "wx/msw/wx.rc"
+
+
diff --git a/contrib/samples/canvas/simple/simple.wdr b/contrib/samples/canvas/simple/simple.wdr
new file mode 100644 (file)
index 0000000..a225b0d
Binary files /dev/null and b/contrib/samples/canvas/simple/simple.wdr differ
diff --git a/contrib/samples/canvas/simple/smile.xpm b/contrib/samples/canvas/simple/smile.xpm
new file mode 100644 (file)
index 0000000..4773967
--- /dev/null
@@ -0,0 +1,42 @@
+/* XPM */
+static char * smile_xpm[] = {
+/* width height ncolors chars_per_pixel */
+"32 32 4 1",
+/* colors */
+"      s None  c None",
+".     c #000000",
+"+     c #ff0000",
+"@     c #ffff00",
+/* pixels */
+"            ........            ",
+"         ...@@@@@@@@...         ",
+"       ..@@@@@@@@@@@@@@..       ",
+"      ..@@@@@@@@@@@@@@@@..      ",
+"     .@@@@@@@@@@@@@@@@@@@@.     ",
+"    .@@@@@@@@@@@@@@@@@@@@@@.    ",
+"   .@@@@@@@@@@@@@@@@@@@@@@@@.   ",
+"  ..@@@@@@@@@@@@@@@@@@@@@@@@..  ",
+"  .@@@@@@@@  @@@@@@  @@@@@@@@.  ",
+" .@@@@@@@@    @@@@    @@@@@@@@. ",
+" .@@@@@@@@    @@@@    @@@@@@@@. ",
+" .@@@@@@@@    @@@@    @@@@@@@@. ",
+".@@@@@@@@@    @@@@    @@@@@@@@@.",
+".@@@@@@@@@    @@@@    @@@@@@@@@.",
+".@@@@@@@@@@  @@@@@@  @@@@@@@@@@.",
+".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
+".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
+".@@@@@@.@@@@@@@@@@@@@@@@.@@@@@@.",
+".@@@....@@@@@@@@@@@@@@@@....@@@.",
+".@@@@@@@.@@@@@@@@@@@@@@.@@@@@@@.",
+" .@@@@@@@.@@@@@@@@@@@@.@@@@@@@. ",
+" .@@@@@@@..@@@@@@@@@@..@@@@@@@. ",
+" .@@@@@@@@...@@@@@@...@@@@@@@@. ",
+"  .@@@@@@@@.+......+.@@@@@@@@.  ",
+"  ..@@@@@@@@.++++++.@@@@@@@@..  ",
+"   .@@@@@@@@@.++++.@@@@@@@@@.   ",
+"    .@@@@@@@@@....@@@@@@@@@.    ",
+"     .@@@@@@@@@@@@@@@@@@@@.     ",
+"      ..@@@@@@@@@@@@@@@@..      ",
+"       ..@@@@@@@@@@@@@@..       ",
+"         ...@@@@@@@@...         ",
+"            ........            "};
index bce306e5b6acd6c73b333f9bbb6c2b765e979aaf..500d2bdd8a4b07149101d9028f8494a24dfcab8a 100644 (file)
@@ -17,6 +17,8 @@ PROGRAM=test
 
 OBJECTS=test.o
 
+DATAFILES = pat4.bmp pat36.bmp
+
 APPEXTRALIBS=$(top_builddir)/lib/libcanvas.@WX_TARGET_LIBRARY_TYPE@
 APPEXTRADEFS=-I$(top_srcdir)/contrib/include
 
diff --git a/contrib/samples/canvas/test/pat36.bmp b/contrib/samples/canvas/test/pat36.bmp
new file mode 100644 (file)
index 0000000..861248a
Binary files /dev/null and b/contrib/samples/canvas/test/pat36.bmp differ
diff --git a/contrib/samples/canvas/test/pat4.bmp b/contrib/samples/canvas/test/pat4.bmp
new file mode 100644 (file)
index 0000000..7e5fe5b
Binary files /dev/null and b/contrib/samples/canvas/test/pat4.bmp differ
index d9e9199a98cbe58e9f6e1b72d7963b9f4f54462d..491be6e47a00f9aaedb9d65922932219ddd3d26c 100644 (file)
  * 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 int dx=0;
-    static int dy=0;
+    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());
 
-    int x = event.GetX();
-    int y = event.GetY();
     if (event.LeftDown())
-    {   
-        dx=x;
-        dy=y;
+    {
         CaptureMouse();
-    } 
+        if (m_dragmode != DRAG_REDRAW)
+            DragStart();
+    }
     else if (event.LeftUp())
     {
         ReleaseMouse();
+        if (m_dragmode != DRAG_REDRAW)
+            DragEnd();
     }
     else if (IsCapturedMouse())
     {
-        Move(m_area.x+x-dx,m_area.y+y-dy);
-        m_owner->UpdateNow();
+        if (m_dragmode != DRAG_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 int dx=0;
-    static int dy=0;
+    wxCanvasObject* obj=(wxCanvasObject*)event.GetEventObject();
+
+    if (!obj->GetDraggable())
+        return;
 
-    //new position of object
-    int x = m_owner->GetDeviceX( event.GetX());
-    int y = m_owner->GetDeviceY( event.GetY());
+    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())
-    {   
-        dx=x;
-        dy=y;
-        CaptureMouse();
-    } 
+    {
+        obj->CaptureMouse();
+        if (obj->GetDragMode() != DRAG_REDRAW)
+            obj->DragStart();
+    }
     else if (event.LeftUp())
     {
-        ReleaseMouse();
+        obj->ReleaseMouse();
+        if (obj->GetDragMode() != DRAG_REDRAW)
+            obj->DragEnd();
     }
-    else if (IsCapturedMouse())
+    else if (obj->IsCapturedMouse())
     {
-        Move(m_x+x-dx,m_y+y-dy);
-        m_owner->UpdateNow();
+        if (obj->GetDragMode() != DRAG_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;
+//------------------------------------------------
+// class MyFrame
+//------------------------------------------------
 
-// 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;
-
-    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,460) )
-{
-    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(TRUE);
+    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( 1000,1000 );
-    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,32,32 );
-    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)
     {
         wxCanvasRect *r = new wxCanvasRect( i,50,3,140 );
         r->SetBrush( *wxRED_BRUSH );
-        m_canvas->Append( r );
+        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 ) );
+    {
+        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( "How are you?", 180, 10,
+    m_datatree->Append( new wxCanvasText( "Hello", 180, 50,
+                      wxGetApp().GetFontPath() + "/times.ttf", 20 ) );
+
+    m_datatree->Append( new wxCanvasText( "How are you?", 180, 10,
                       wxGetApp().GetFontPath() + "/times.ttf", 8 ) );
 
-    m_canvas->Append( new wxCanvasText( "How are you?", 180, 20,
+    m_datatree->Append( new wxCanvasText( "How are you?", 180, 20,
                       wxGetApp().GetFontPath() + "/times.ttf", 10 ) );
 
-    m_canvas->Append( new wxCanvasText( "How are you?", 180, 30,
+    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_canvas->Append( m_sm3 );
-
+    m_datatree->Append( m_sm3 );
+*/
     for (i = 10; i < 300; i+=10)
-        m_canvas->Append( new wxCanvasLine( 10,-15,i,300 ) );
-
-    m_sm4 = new MywxCanvasImage( image, 0,270,64,32 );
-    m_canvas->Append( m_sm4 );
-
+        m_datatree->Append( new wxCanvasLine( 10,-15,i,300 ) );
+/*
+    m_sm4 = new wxCanvasImage( image, 0,270,64,32 );
+    m_sm4->SetDragMode(DRAG_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 ) );
+    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 ) );
+    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(DRAG_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(DRAG_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;
@@ -286,16 +494,125 @@ MyFrame::MyFrame()
 
     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 );
@@ -303,32 +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()+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,wxCanvas)
+    EVT_MOUSE_EVENTS (MyCanvas::OnMouseEvent)
+END_EVENT_TABLE()
+
+MyCanvas::MyCanvas(wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id,
+    const wxPoint &position, const wxSize& size, long style ) :
+    wxCanvas( 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
+    {
+        wxCanvas::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.");
@@ -341,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;
 }
 
-
diff --git a/contrib/samples/canvas/test/test.h b/contrib/samples/canvas/test/test.h
new file mode 100644 (file)
index 0000000..3bb2209
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * Program: canvas
+ *
+ * Author: Robert Roebling
+ *
+ * Copyright: (C) 1998, Robert Roebling
+ *
+ */
+// For compilers that support precompilation, includes "wx/wx.h".
+
+#ifndef __test_H__
+#define __test_H__
+
+#ifdef __GNUG__
+    #pragma interface "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/splitter.h>
+
+#include "wx/canvas/canvas.h"
+#include "wx/canvas/polygon.h"
+
+class MyCanvas;
+
+// derived classes
+class MywxCanvasObjectRef: public wxCanvasObjectRef
+{
+    DECLARE_DYNAMIC_CLASS(MywxCanvasObjectRef)
+
+public:
+    MywxCanvasObjectRef();
+    MywxCanvasObjectRef(double x, double y, wxCanvasObjectGroup* group);
+    ~MywxCanvasObjectRef();
+
+    void OnMouseEvent(wxMouseEvent &event);
+
+private:
+    DECLARE_EVENT_TABLE()
+};
+
+
+class MyEventHandler: public wxEvtHandler
+{
+public:
+    MyEventHandler();
+
+    void OnMouseEvent(wxMouseEvent &event);
+
+private:
+
+    DECLARE_EVENT_TABLE()
+};
+
+
+class MySplitterWindow : public wxSplitterWindow
+{
+public:
+  MySplitterWindow(wxFrame *parent, wxWindowID id)
+    : wxSplitterWindow(parent, id, wxDefaultPosition, wxDefaultSize, wxSP_3D | wxSP_LIVE_UPDATE)
+  {
+    m_frame = parent;
+  }
+
+  virtual bool OnSashPositionChange(int newSashPosition)
+  {
+    if ( !wxSplitterWindow::OnSashPositionChange(newSashPosition) )
+      return FALSE;
+
+    wxString str;
+    str.Printf( _T("Sash position = %d"), newSashPosition);
+    m_frame->SetStatusText(str);
+
+    return TRUE;
+  }
+
+  void SetStatusText(const wxString& str ){m_frame->SetStatusText(str);}
+
+private:
+  wxFrame *m_frame;
+};
+
+
+// MyFrame
+const int ID_ABOUT = 109;
+
+// MyFrame
+class MyFrame: public wxFrame
+{
+public:
+    MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size);
+    virtual ~MyFrame();
+
+    // Menu commands
+    void SplitHorizontal(wxCommandEvent& event);
+    void SplitVertical(wxCommandEvent& event);
+    void Unsplit(wxCommandEvent& event);
+    void SetMinSize(wxCommandEvent& event);
+    void Quit(wxCommandEvent& event);
+
+    // Menu command update functions
+    void UpdateUIHorizontal(wxUpdateUIEvent& event);
+    void UpdateUIVertical(wxUpdateUIEvent& event);
+    void UpdateUIUnsplit(wxUpdateUIEvent& event);
+
+    void OnAbout( wxCommandEvent &event );
+    void OnNewFrame( wxCommandEvent &event );
+    void OnQuit( wxCommandEvent &event );
+    void OnTimer( wxTimerEvent &event );
+
+    wxCanvasObject   *m_sm1;
+    wxCanvasObject   *m_sm2;
+    wxCanvasObject   *m_sm3;
+    wxCanvasObject   *m_sm4;
+
+    MywxCanvasObjectRef *m_ref;
+    MywxCanvasObjectRef *m_ref2;
+
+    wxTimer          *m_timer;
+    wxTextCtrl       *m_log;
+
+    wxBitmap gs_bmp36_mono;
+
+private:
+
+    void UpdatePosition();
+
+    wxMenu*    fileMenu;
+    wxMenuBar*  menuBar;
+    MyCanvas*  m_canvas1;
+    MyCanvas*  m_canvas2;
+    MySplitterWindow* m_splitter;
+
+    wxCanvasAdmin m_canvasadmin;
+
+    wxCanvasObjectGroup* m_datatree;
+
+    DECLARE_EVENT_TABLE()
+
+    MyEventHandler* m_eventhandler;
+};
+
+// ID for the menu commands
+enum
+{
+  SPLIT_QUIT,
+  SPLIT_HORIZONTAL,
+  SPLIT_VERTICAL,
+  SPLIT_UNSPLIT,
+  SPLIT_SETMINSIZE
+};
+
+// Window ids
+#define SPLITTER_WINDOW     100
+#define SPLITTER_FRAME      101
+#define CANVAS1             102
+#define CANVAS2             103
+
+class MyCanvas: public wxCanvas
+{
+public:
+    MyCanvas( wxCanvasAdmin* admin, MySplitterWindow *parent, wxWindowID id = -1,
+        const wxPoint& pos = wxDefaultPosition,
+        const wxSize& size = wxDefaultSize,
+        long style = wxScrolledWindowStyle );
+
+    void OnMouseEvent(wxMouseEvent& event);
+
+private:
+
+    //mouse position used for displaying it in the statusbar
+    int          m_mouse_x;
+    //mouse position used for displaying it in the statusbar
+    int          m_mouse_y;
+    //mouse position used for displaying it in the statusbar
+    double       m_mouse_worldx;
+    //mouse position used for displaying it in the statusbar
+    double       m_mouse_worldy;
+
+    //mouse position used for zooming
+    double       m_zoom_x1;
+    //mouse position used for zooming
+    double       m_zoom_y1;
+    //mouse position used for zooming
+    double       m_zoom_x2;
+    //mouse position used for zooming
+    double       m_zoom_y2;
+
+    //declare events
+    DECLARE_EVENT_TABLE()
+
+    //parent of the canvas
+    MySplitterWindow *m_parent;
+};
+
+// MyApp
+
+class MyApp: public wxApp
+{
+public:
+    virtual bool OnInit();
+
+    const wxString& GetFontPath() const { return m_fontpath; }
+
+private:
+    wxString m_fontpath;
+};
+
+#endif
index bc90feee387bee3e5901383f7e3bac65d51e066e..227b0d1c339816cb6d4f6f95d36b398dc92b9e0b 100644 (file)
@@ -17,7 +17,7 @@
     #pragma hdrstop
 #endif
 
-#include "bbox.h"
+#include "wx/canvas/bbox.h"
 
 wxBoundingBox::wxBoundingBox()
 {
index f0b3983b5a2a9099b486a9a85072030d56473327..12ff75ff0b998d8dd6edf87fd4c8ebab914f48f5 100644 (file)
@@ -17,9 +17,9 @@
     #pragma hdrstop
 #endif
 
-#include "canvas.h"
-#include "polygon.h"
-#include "liner.h"
+#include "wx/canvas/canvas.h"
+#include "wx/canvas/polygon.h"
+#include "wx/canvas/liner.h"
 
 #ifdef __WXGTK__
     #include <gtk/gtk.h>
index 02ca1703fb0136441d0ef6be4640ef7ddb3ec04a..9ee4607099321ced9a1e4a291b9e3748a60e4983 100644 (file)
@@ -12,7 +12,7 @@ Last Update 05-12-1995
 
 #include <stdlib.h>
 
-#include "liner.h"
+#include "wx/canvas/liner.h"
 
 wxLine::wxLine( double x1, double y1, double x2, double y2 )
 {
index efc3269b80bff6b1ecbaa1333199f6ced206e7b6..d7b159f683d8f012bbe86813fcfa83103a403b57 100644 (file)
@@ -17,8 +17,8 @@
     #pragma hdrstop
 #endif
 
-#include "polygon.h"
-#include "liner.h"
+#include "wx/canvas/polygon.h"
+#include "wx/canvas/liner.h"
 
 void ConvertSplinedPolygon(wxList* list, double Aber);
 void ConvertSplinedPolyline(wxList* list,double Aber);