X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cb7d73757f9e8771e7d8fc6b22f1acf27aac35bd..e8352927820b19e33819f38f5f5d6a905d9d6d44:/samples/vscroll/vstest.cpp diff --git a/samples/vscroll/vstest.cpp b/samples/vscroll/vstest.cpp index ff4b716705..c8af46184e 100644 --- a/samples/vscroll/vstest.cpp +++ b/samples/vscroll/vstest.cpp @@ -2,7 +2,7 @@ // Name: samples/vscroll/vstest.cpp // Purpose: VScroll wxWidgets sample // Author: Vadim Zeitlin -// Modified by: +// Modified by: Brad Anderson // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) 2003 Vadim Zeitlin @@ -44,12 +44,18 @@ #include "../sample.xpm" #endif +// ---------------------------------------------------------------------------- +// definitions +// ---------------------------------------------------------------------------- + +#define MAX_LINES 10000 + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- // Define a new application type, each program should derive a class from wxApp -class VScrollApp : public wxApp +class VarScrollApp : public wxApp { public: // create our main window @@ -57,14 +63,17 @@ public: }; // Define a new frame type: this is going to be our main frame -class VScrollFrame : public wxFrame +class VarScrollFrame : public wxFrame { public: // ctor - VScrollFrame(); + VarScrollFrame(); // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); + void OnModeVScroll(wxCommandEvent& event); + void OnModeHScroll(wxCommandEvent& event); + void OnModeHVScroll(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); void OnSize(wxSizeEvent& event) @@ -82,6 +91,9 @@ public: } private: + // either a wxVScrolledWindow or a wxHVScrolled window, depending on current mode + wxPanel *m_scrollWindow; + // any class wishing to process wxWidgets events must use this macro DECLARE_EVENT_TABLE() }; @@ -93,7 +105,11 @@ public: { m_frame = frame; - SetLineCount(200); + SetRowCount(MAX_LINES); + + int i; + for ( i = 0; i < MAX_LINES; ++i ) + m_heights[i] = rand()%25+16; // low: 16; high: 40 m_changed = true; } @@ -116,21 +132,23 @@ public: { wxPaintDC dc(this); - dc.SetPen(*wxBLACK_DASHED_PEN); + dc.SetPen(*wxBLACK_PEN); - const size_t lineFirst = GetFirstVisibleLine(), - lineLast = GetLastVisibleLine(); + const size_t lineFirst = GetVisibleBegin(), + lineLast = GetVisibleEnd(); const wxCoord hText = dc.GetCharHeight(); + wxSize clientSize = GetClientSize(); + wxCoord y = 0; - for ( size_t line = lineFirst; line <= lineLast; line++ ) + for ( size_t line = lineFirst; line < lineLast; line++ ) { - dc.DrawLine(0, y, 1000, y); + dc.DrawLine(0, y, clientSize.GetWidth(), y); - wxCoord hLine = OnGetLineHeight(line); + wxCoord hLine = OnGetRowHeight(line); dc.DrawText(wxString::Format(_T("Line %lu"), (unsigned long)line), - 0, y + (hLine - hText) / 2); + 2, y + (hLine - hText) / 2); y += hLine; dc.DrawLine(0, y, 1000, y); @@ -144,17 +162,27 @@ public: event.Skip(); } + void OnMouse(wxMouseEvent& event) + { + if(event.LeftDown()) + CaptureMouse(); + else if(event.LeftUp()) + ReleaseMouse(); + event.Skip(); + } - virtual wxCoord OnGetLineHeight(size_t n) const + virtual wxCoord OnGetRowHeight(size_t n) const { - wxASSERT( n < GetLineCount() ); + wxASSERT( n < GetRowCount() ); - return n % 2 ? 15 : 30; // 15 + 2*n + return m_heights[n]; } private: wxFrame *m_frame; + int m_heights[MAX_LINES]; + bool m_changed; DECLARE_EVENT_TABLE() @@ -164,6 +192,233 @@ BEGIN_EVENT_TABLE(VScrollWindow, wxVScrolledWindow) EVT_IDLE(VScrollWindow::OnIdle) EVT_PAINT(VScrollWindow::OnPaint) EVT_SCROLLWIN(VScrollWindow::OnScroll) + EVT_MOUSE_EVENTS(VScrollWindow::OnMouse) +END_EVENT_TABLE() + +class HScrollWindow : public wxHScrolledWindow +{ +public: + HScrollWindow(wxFrame *frame) : wxHScrolledWindow(frame, wxID_ANY) + { + m_frame = frame; + + SetColumnCount(MAX_LINES); + + int i; + for ( i = 0; i < MAX_LINES; ++i ) + m_heights[i] = rand()%25+16; // low: 15; high: 40 + + m_changed = true; + } + + void OnIdle(wxIdleEvent&) + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(wxString::Format + ( + _T("Page size = %d, pos = %d, max = %d"), + GetScrollThumb(wxVERTICAL), + GetScrollPos(wxVERTICAL), + GetScrollRange(wxVERTICAL) + )); +#endif // wxUSE_STATUSBAR + m_changed = false; + } + + void OnPaint(wxPaintEvent&) + { + wxPaintDC dc(this); + + dc.SetPen(*wxBLACK_PEN); + + const size_t lineFirst = GetVisibleBegin(), + lineLast = GetVisibleEnd(); + + const wxCoord hText = dc.GetCharHeight(); + + wxSize clientSize = GetClientSize(); + + wxCoord x = 0; + for ( size_t line = lineFirst; line < lineLast; line++ ) + { + dc.DrawLine(x, 0, x, clientSize.GetHeight()); + + wxCoord wLine = OnGetColumnWidth(line); + dc.DrawRotatedText(wxString::Format(_T("Line %lu"), (unsigned long)line), + x + (wLine - hText) / 2, clientSize.GetHeight() - 5, 90); + + x += wLine; + dc.DrawLine(x, 0, x, 1000); + } + } + + void OnScroll(wxScrollWinEvent& event) + { + m_changed = true; + + event.Skip(); + } + + void OnMouse(wxMouseEvent& event) + { + if(event.LeftDown()) + CaptureMouse(); + else if(event.LeftUp()) + ReleaseMouse(); + event.Skip(); + } + + virtual wxCoord OnGetColumnWidth(size_t n) const + { + wxASSERT( n < GetColumnCount() ); + + return m_heights[n]; + } + +private: + wxFrame *m_frame; + + int m_heights[MAX_LINES]; + + bool m_changed; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(HScrollWindow, wxHScrolledWindow) + EVT_IDLE(HScrollWindow::OnIdle) + EVT_PAINT(HScrollWindow::OnPaint) + EVT_SCROLLWIN(HScrollWindow::OnScroll) + EVT_MOUSE_EVENTS(HScrollWindow::OnMouse) +END_EVENT_TABLE() + +class HVScrollWindow : public wxHVScrolledWindow +{ +public: + HVScrollWindow(wxFrame *frame) : wxHVScrolledWindow(frame, wxID_ANY) + { + m_frame = frame; + + SetRowColumnCount(MAX_LINES, MAX_LINES); + + int i; + for ( i = 0; i < MAX_LINES; ++i ) + { + m_heights[i] = rand()%30+31; // low: 30; high: 60 + m_widths[i] = rand()%30+61; // low: 60; high: 90 + } + + m_changed = true; + } + + void OnIdle(wxIdleEvent&) + { +#if wxUSE_STATUSBAR + m_frame->SetStatusText(wxString::Format + ( + _T("Page size = %d rows %d columns; pos = row: %d, column: %d; max = %d rows, %d columns"), + GetScrollThumb(wxVERTICAL), + GetScrollThumb(wxHORIZONTAL), + GetScrollPos(wxVERTICAL), + GetScrollPos(wxHORIZONTAL), + GetScrollRange(wxVERTICAL), + GetScrollRange(wxHORIZONTAL) + )); +#endif // wxUSE_STATUSBAR + m_changed = false; + } + + void OnPaint(wxPaintEvent&) + { + wxPaintDC dc(this); + + dc.SetPen(*wxBLACK_PEN); + + const size_t rowFirst = GetVisibleRowsBegin(), + rowLast = GetVisibleRowsEnd(); + const size_t columnFirst = GetVisibleColumnsBegin(), + columnLast = GetVisibleColumnsEnd(); + + const wxCoord hText = dc.GetCharHeight(); + + wxSize clientSize = GetClientSize(); + + wxCoord y = 0; + wxCoord x = 0; + for ( size_t row = rowFirst; row < rowLast; row++ ) + { + wxCoord rowHeight = OnGetRowHeight(row); + dc.DrawLine(0, y, clientSize.GetWidth(), y); + + x = 0; + for ( size_t col = columnFirst; col < columnLast; col++ ) + { + wxCoord colWidth = OnGetColumnWidth(col); + + if ( row == rowFirst ) + dc.DrawLine(x, 0, x, clientSize.GetHeight()); + + dc.DrawText(wxString::Format(_T("Row %lu"), (unsigned long)row), + x + 2, y + rowHeight / 2 - hText); + dc.DrawText(wxString::Format(_T("Col %lu"), (unsigned long)col), + x + 2, y + rowHeight / 2); + + x += colWidth; + if ( row == rowFirst) + dc.DrawLine(x, 0, x, clientSize.GetHeight()); + } + + y += rowHeight; + dc.DrawLine(0, y, clientSize.GetWidth(), y); + } + } + + void OnScroll(wxScrollWinEvent& event) + { + m_changed = true; + + event.Skip(); + } + + void OnMouse(wxMouseEvent& event) + { + if(event.LeftDown()) + CaptureMouse(); + else if(event.LeftUp()) + ReleaseMouse(); + event.Skip(); + } + + virtual wxCoord OnGetRowHeight(size_t n) const + { + wxASSERT( n < GetRowCount() ); + + return m_heights[n]; + } + + virtual wxCoord OnGetColumnWidth(size_t n) const + { + wxASSERT( n < GetColumnCount() ); + + return m_widths[n]; + } + +private: + wxFrame *m_frame; + + int m_heights[MAX_LINES]; + int m_widths[MAX_LINES]; + + bool m_changed; + + DECLARE_EVENT_TABLE() +}; + +BEGIN_EVENT_TABLE(HVScrollWindow, wxHVScrolledWindow) + EVT_IDLE(HVScrollWindow::OnIdle) + EVT_PAINT(HVScrollWindow::OnPaint) + EVT_SCROLLWIN(HVScrollWindow::OnScroll) + EVT_MOUSE_EVENTS(HVScrollWindow::OnMouse) END_EVENT_TABLE() // ---------------------------------------------------------------------------- @@ -179,7 +434,11 @@ enum // it is important for the id corresponding to the "About" command to have // this standard value as otherwise it won't be handled properly under Mac // (where it is special and put into the "Apple" menu) - VScroll_About = wxID_ABOUT + VScroll_About = wxID_ABOUT, + + VScroll_VScrollMode = wxID_HIGHEST + 1, + VScroll_HScrollMode, + VScroll_HVScrollMode }; // ---------------------------------------------------------------------------- @@ -189,18 +448,21 @@ enum // the event tables connect the wxWidgets events with the functions (event // handlers) which process them. It can be also done at run-time, but for the // simple menu events like this the static method is much simpler. -BEGIN_EVENT_TABLE(VScrollFrame, wxFrame) - EVT_MENU(VScroll_Quit, VScrollFrame::OnQuit) - EVT_MENU(VScroll_About, VScrollFrame::OnAbout) - EVT_SIZE(VScrollFrame::OnSize) +BEGIN_EVENT_TABLE(VarScrollFrame, wxFrame) + EVT_MENU(VScroll_Quit, VarScrollFrame::OnQuit) + EVT_MENU(VScroll_VScrollMode, VarScrollFrame::OnModeVScroll) + EVT_MENU(VScroll_HScrollMode, VarScrollFrame::OnModeHScroll) + EVT_MENU(VScroll_HVScrollMode, VarScrollFrame::OnModeHVScroll) + EVT_MENU(VScroll_About, VarScrollFrame::OnAbout) + EVT_SIZE(VarScrollFrame::OnSize) END_EVENT_TABLE() // Create a new application object: this macro will allow wxWidgets to create // the application object during program execution (it's better than using a // static object for many reasons) and also declares the accessor function -// wxGetApp() which will return the reference of the right type (i.e. VScrollApp and +// wxGetApp() which will return the reference of the right type (i.e. VarScrollApp and // not wxApp) -IMPLEMENT_APP(VScrollApp) +IMPLEMENT_APP(VarScrollApp) // ============================================================================ // implementation @@ -211,10 +473,13 @@ IMPLEMENT_APP(VScrollApp) // ---------------------------------------------------------------------------- // 'Main program' equivalent: the program execution "starts" here -bool VScrollApp::OnInit() +bool VarScrollApp::OnInit() { + if ( !wxApp::OnInit() ) + return false; + // create the main application window - VScrollFrame *frame = new VScrollFrame; + VarScrollFrame *frame = new VarScrollFrame; // and show it (the frames, unlike simple controls, are not shown when // created initially) @@ -229,12 +494,13 @@ bool VScrollApp::OnInit() // ---------------------------------------------------------------------------- // frame constructor -VScrollFrame::VScrollFrame() - : wxFrame(NULL, - wxID_ANY, - _T("VScroll wxWidgets Sample"), - wxDefaultPosition, - wxSize(400, 350)) +VarScrollFrame::VarScrollFrame() + : wxFrame(NULL, + wxID_ANY, + _T("VScroll wxWidgets Sample"), + wxDefaultPosition, + wxSize(400, 350)), + m_scrollWindow(NULL) { // set the frame icon SetIcon(wxICON(sample)); @@ -243,15 +509,36 @@ VScrollFrame::VScrollFrame() // create a menu bar wxMenu *menuFile = new wxMenu; + wxMenu *menuMode = new wxMenu; + // the "About" item should be in the help menu wxMenu *menuHelp = new wxMenu; menuHelp->Append(VScroll_About, _T("&About...\tF1"), _T("Show about dialog")); +#ifdef wxHAS_RADIO_MENU_ITEMS + menuMode->AppendRadioItem(VScroll_VScrollMode, _T("&Vertical\tAlt-V"), + _T("Vertical scrolling only")); + menuMode->AppendRadioItem(VScroll_HScrollMode, _T("&Horizontal\tAlt-H"), + _T("Horizontal scrolling only")); + menuMode->AppendRadioItem(VScroll_HVScrollMode, + _T("Hori&zontal/Vertical\tAlt-Z"), + _T("Horizontal and vertical scrolling")); + menuMode->Check(VScroll_VScrollMode, true); +#else + menuMode->Append(VScroll_VScrollMode, _T("&Vertical\tAlt-V"), + _T("Vertical scrolling only")); + menuMode->Append(VScroll_HScrollMode, _T("&Horizontal\tAlt-H"), + _T("Horizontal scrolling only")); + menuMode->Append(VScroll_HVScrollMode, _T("Hori&zontal/Vertical\tAlt-Z"), + _T("Horizontal and vertical scrolling")); +#endif + menuFile->Append(VScroll_Quit, _T("E&xit\tAlt-X"), _T("Quit this program")); // now append the freshly created menu to the menu bar... wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, _T("&File")); + menuBar->Append(menuMode, _T("&Mode")); menuBar->Append(menuHelp, _T("&Help")); // ... and attach this menu bar to the frame @@ -262,26 +549,62 @@ VScrollFrame::VScrollFrame() // create a status bar just for fun (by default with 1 pane only) CreateStatusBar(2); SetStatusText(_T("Welcome to wxWidgets!")); + int widths[2]; + widths[0] = -1; + widths[1] = 100; + SetStatusWidths(2, widths); #endif // wxUSE_STATUSBAR // create our one and only child -- it will take our entire client area - new VScrollWindow(this); + if ( menuMode->IsChecked(VScroll_VScrollMode) ) + m_scrollWindow = new VScrollWindow(this); + else if ( menuMode->IsChecked(VScroll_HScrollMode) ) + m_scrollWindow = new HScrollWindow(this); + else + m_scrollWindow = new HVScrollWindow(this); } // ---------------------------------------------------------------------------- // event handlers // ---------------------------------------------------------------------------- -void VScrollFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) +void VarScrollFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { // true is to force the frame to close Close(true); } -void VScrollFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) +void VarScrollFrame::OnModeVScroll(wxCommandEvent& WXUNUSED(event)) +{ + if ( m_scrollWindow ) + m_scrollWindow->Destroy(); + + m_scrollWindow = new VScrollWindow(this); + SendSizeEvent(); +} + +void VarScrollFrame::OnModeHScroll(wxCommandEvent& WXUNUSED(event)) +{ + if ( m_scrollWindow ) + m_scrollWindow->Destroy(); + + m_scrollWindow = new HScrollWindow(this); + SendSizeEvent(); +} + +void VarScrollFrame::OnModeHVScroll(wxCommandEvent& WXUNUSED(event)) +{ + if ( m_scrollWindow ) + m_scrollWindow->Destroy(); + + m_scrollWindow = new HVScrollWindow(this); + SendSizeEvent(); +} + +void VarScrollFrame::OnAbout(wxCommandEvent& WXUNUSED(event)) { wxMessageBox(_T("VScroll shows how to implement scrolling with\n") - _T("variable line heights.\n") + _T("variable line widths and heights.\n") _T("(c) 2003 Vadim Zeitlin"), _T("About VScroll"), wxOK | wxICON_INFORMATION,