X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c67daf87774c71ae9f73af9969008af220e52a11..1aaef6141668b72b948b9a14ff9afbc7b352ac5c:/samples/splitter/test.cpp diff --git a/samples/splitter/test.cpp b/samples/splitter/test.cpp index a32d2f0a12..d443b1ad67 100644 --- a/samples/splitter/test.cpp +++ b/samples/splitter/test.cpp @@ -1,12 +1,12 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: splitter.cpp +// Name: m_splitter.cpp // Purpose: wxSplitterWindow sample // Author: Julian Smart // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -29,36 +29,60 @@ class MyCanvas; class MyApp: public wxApp { public: - bool OnInit(); + bool OnInit(); }; -class MyFrame: public wxFrame +class MySplitterWindow : public wxSplitterWindow { public: - MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size); - virtual ~MyFrame(); - - bool OnClose(); + 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; + } + +private: + wxFrame *m_frame; +}; - // Menu commands - void SplitHorizontal(wxCommandEvent& event); - void SplitVertical(wxCommandEvent& event); - void Unsplit(wxCommandEvent& event); - void Quit(wxCommandEvent& event); +class MyFrame: public wxFrame +{ +public: + MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size); + virtual ~MyFrame(); - // Menu command update functions - void UpdateUIHorizontal(wxUpdateUIEvent& event); - void UpdateUIVertical(wxUpdateUIEvent& event); - void UpdateUIUnsplit(wxUpdateUIEvent& event); + // Menu commands + void SplitHorizontal(wxCommandEvent& event); + void SplitVertical(wxCommandEvent& event); + void Unsplit(wxCommandEvent& event); + void SetMinSize(wxCommandEvent& event); + void Quit(wxCommandEvent& event); - void OnIdle(wxIdleEvent& event); + // Menu command update functions + void UpdateUIHorizontal(wxUpdateUIEvent& event); + void UpdateUIVertical(wxUpdateUIEvent& event); + void UpdateUIUnsplit(wxUpdateUIEvent& event); private: - wxMenu* fileMenu; - wxMenuBar* menuBar; - MyCanvas* leftCanvas; - MyCanvas* rightCanvas; - wxSplitterWindow* splitter; + void UpdatePosition(); + + wxMenu* fileMenu; + wxMenuBar* menuBar; + MyCanvas* m_leftCanvas; + MyCanvas* m_rightCanvas; + MySplitterWindow* m_splitter; DECLARE_EVENT_TABLE() }; @@ -66,10 +90,10 @@ DECLARE_EVENT_TABLE() class MyCanvas: public wxScrolledWindow { public: - MyCanvas(wxWindow* parent, int x, int y, int w, int h); + MyCanvas(wxWindow* parent, wxWindowID id, int x, int y, int w, int h, const wxString &name); virtual ~MyCanvas(); - virtual void OnDraw(wxDC& dc); + virtual void OnDraw(wxDC& dc); DECLARE_EVENT_TABLE() }; @@ -77,143 +101,163 @@ DECLARE_EVENT_TABLE() BEGIN_EVENT_TABLE(MyCanvas, wxScrolledWindow) END_EVENT_TABLE() -// ID for the menu quit command -#define SPLIT_QUIT 1 -#define SPLIT_HORIZONTAL 2 -#define SPLIT_VERTICAL 3 -#define SPLIT_UNSPLIT 4 +// 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 IMPLEMENT_APP(MyApp) bool MyApp::OnInit(void) { - MyFrame* frame = new MyFrame((wxFrame *) NULL, (char *) "wxSplitterWindow Example", wxPoint(50, 50), wxSize(400, 300)); + MyFrame* frame = new MyFrame((wxFrame *) NULL, "wxSplitterWindow Example", + wxPoint(50, 50), wxSize(420, 300)); - // Show the frame - frame->Show(TRUE); + // Show the frame + frame->Show(TRUE); - SetTopWindow(frame); + SetTopWindow(frame); - return TRUE; + return TRUE; } 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_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical) - EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal) - EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit) - EVT_IDLE(MyFrame::OnIdle) + 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) + + EVT_UPDATE_UI(SPLIT_VERTICAL, MyFrame::UpdateUIVertical) + EVT_UPDATE_UI(SPLIT_HORIZONTAL, MyFrame::UpdateUIHorizontal) + EVT_UPDATE_UI(SPLIT_UNSPLIT, MyFrame::UpdateUIUnsplit) END_EVENT_TABLE() // My frame constructor MyFrame::MyFrame(wxFrame* frame, const wxString& title, const wxPoint& pos, const wxSize& size): - wxFrame(frame, -1, title, pos, size) + wxFrame(frame, SPLITTER_FRAME, title, pos, size) { - // set the icon -#ifdef __WXMSW__ - SetIcon(wxIcon("mondrian")); -#endif - - CreateStatusBar(1); + CreateStatusBar(2); - // Make a menubar - fileMenu = new wxMenu; - fileMenu->Append(SPLIT_VERTICAL, "Split &Vertically", "Split vertically"); - fileMenu->Append(SPLIT_HORIZONTAL, "Split &Horizontally", "Split horizontally"); - fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit", "Unsplit"); - fileMenu->Append(SPLIT_QUIT, "E&xit", "Exit"); + // Make a menubar + fileMenu = new wxMenu; + fileMenu->Append(SPLIT_VERTICAL, "Split &Vertically", "Split vertically"); + fileMenu->Append(SPLIT_HORIZONTAL, "Split &Horizontally", "Split horizontally"); + fileMenu->Append(SPLIT_UNSPLIT, "&Unsplit", "Unsplit"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_SETMINSIZE, "Set &min size", "Set minimum pane size"); + fileMenu->AppendSeparator(); + fileMenu->Append(SPLIT_QUIT, "E&xit", "Exit"); - menuBar = new wxMenuBar; - menuBar->Append(fileMenu, "&File"); + menuBar = new wxMenuBar; + menuBar->Append(fileMenu, "&File"); - SetMenuBar(menuBar); + SetMenuBar(menuBar); - splitter = new wxSplitterWindow(this, -1, wxPoint(0, 0), wxSize(400, 400), -// wxSP_BORDER); - wxSP_3D); -// wxSP_NOBORDER); - - leftCanvas = new MyCanvas(splitter, 0, 0, 400, 400); - leftCanvas->SetBackgroundColour(*wxRED); - leftCanvas->SetScrollbars(20, 20, 50, 50); + m_splitter = new MySplitterWindow(this, SPLITTER_WINDOW); + + wxSize sz( m_splitter->GetSize() ); + wxLogMessage( "Initial splitter size: %d %d\n", (int)sz.x, (int)sz.y ); - rightCanvas = new MyCanvas(splitter, 0, 0, 400, 400); - rightCanvas->SetBackgroundColour(*wxCYAN); - rightCanvas->SetScrollbars(20, 20, 50, 50); - rightCanvas->Show(FALSE); + m_leftCanvas = new MyCanvas(m_splitter, CANVAS1, 0, 0, 400, 400, "Test1" ); + m_leftCanvas->SetBackgroundColour(*wxRED); + m_leftCanvas->SetScrollbars(20, 20, 50, 50); + m_leftCanvas->SetCursor(wxCursor(wxCURSOR_MAGNIFIER)); - splitter->Initialize(leftCanvas); + m_rightCanvas = new MyCanvas(m_splitter, CANVAS2, 0, 0, 400, 400, "Test2" ); + m_rightCanvas->SetBackgroundColour(*wxCYAN); + m_rightCanvas->SetScrollbars(20, 20, 50, 50); + m_rightCanvas->Show(FALSE); - // Set this to prevent unsplitting -// splitter->SetMinimumPaneSize(20); + m_splitter->Initialize(m_leftCanvas); + SetStatusText("Min pane size = 0", 1); } MyFrame::~MyFrame() { } -bool MyFrame::OnClose() -{ - return TRUE; -} - void MyFrame::Quit(wxCommandEvent& WXUNUSED(event) ) { - Close(TRUE); + Close(TRUE); } void MyFrame::SplitHorizontal(wxCommandEvent& WXUNUSED(event) ) { - if ( splitter->IsSplit() ) - splitter->Unsplit(); - leftCanvas->Show(TRUE); - rightCanvas->Show(TRUE); - splitter->SplitHorizontally( leftCanvas, rightCanvas ); + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_leftCanvas->Show(TRUE); + m_rightCanvas->Show(TRUE); + m_splitter->SplitHorizontally( m_leftCanvas, m_rightCanvas ); + UpdatePosition(); } void MyFrame::SplitVertical(wxCommandEvent& WXUNUSED(event) ) { - if ( splitter->IsSplit() ) - splitter->Unsplit(); - leftCanvas->Show(TRUE); - rightCanvas->Show(TRUE); - splitter->SplitVertically( leftCanvas, rightCanvas ); + if ( m_splitter->IsSplit() ) + m_splitter->Unsplit(); + m_leftCanvas->Show(TRUE); + m_rightCanvas->Show(TRUE); + m_splitter->SplitVertically( m_leftCanvas, m_rightCanvas ); + UpdatePosition(); } void MyFrame::Unsplit(wxCommandEvent& WXUNUSED(event) ) { - if ( splitter->IsSplit() ) - splitter->Unsplit(); + 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( ( (!splitter->IsSplit()) || (splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) ); + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_HORIZONTAL) ) ); } void MyFrame::UpdateUIVertical(wxUpdateUIEvent& event) { - event.Enable( ( (!splitter->IsSplit()) || (splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) ); + event.Enable( ( (!m_splitter->IsSplit()) || (m_splitter->GetSplitMode() != wxSPLIT_VERTICAL) ) ); } void MyFrame::UpdateUIUnsplit(wxUpdateUIEvent& event) { - event.Enable( splitter->IsSplit() ); + event.Enable( m_splitter->IsSplit() ); } -void MyFrame::OnIdle(wxIdleEvent& event) +void MyFrame::UpdatePosition() { - if ( GetStatusBar()->GetStatusText(0) != "Ready" ) - SetStatusText("Ready"); - - wxFrame::OnIdle(event); + wxString str; + str.Printf( _("Sash position = %d"), m_splitter->GetSashPosition()); + SetStatusText(str); } -MyCanvas::MyCanvas(wxWindow* parent, int x, int y, int w, int h) : - wxScrolledWindow(parent, -1, wxPoint(x, y), wxSize(w, h)) +MyCanvas::MyCanvas(wxWindow* parent, wxWindowID id, int x, int y, int w, int h, const wxString &name ) : + wxScrolledWindow(parent, id, wxPoint(x, y), wxSize(w, h), 0, name ) { } @@ -223,13 +267,13 @@ MyCanvas::~MyCanvas() void MyCanvas::OnDraw(wxDC& dc) { - dc.SetPen(*wxBLACK_PEN); - dc.DrawLine(0, 0, 100, 100); + dc.SetPen(*wxBLACK_PEN); + dc.DrawLine(0, 0, 100, 100); - dc.SetBackgroundMode(wxTRANSPARENT); - dc.DrawText("Testing", 50, 50); + dc.SetBackgroundMode(wxTRANSPARENT); + dc.DrawText("Testing", 50, 50); - dc.SetPen(*wxRED_PEN); - dc.SetBrush(*wxGREEN_BRUSH); - dc.DrawRectangle(120, 120, 100, 80); + dc.SetPen(*wxRED_PEN); + dc.SetBrush(*wxGREEN_BRUSH); + dc.DrawRectangle(120, 120, 100, 80); }