This file is indexed.

/usr/include/wx-3.0/wx/vscroll.h is in wx3.0-headers 3.0.4+dfsg-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
/////////////////////////////////////////////////////////////////////////////
// Name:        wx/vscroll.h
// Purpose:     Variable scrolled windows (wx[V/H/HV]ScrolledWindow)
// Author:      Vadim Zeitlin
// Modified by: Brad Anderson, Bryan Petty
// Created:     30.05.03
// Copyright:   (c) 2003 Vadim Zeitlin <vadim@wxwidgets.org>
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

#ifndef _WX_VSCROLL_H_
#define _WX_VSCROLL_H_

#include "wx/panel.h"
#include "wx/position.h"
#include "wx/scrolwin.h"

class WXDLLIMPEXP_FWD_CORE wxVarScrollHelperEvtHandler;


// Using the same techniques as the wxScrolledWindow class      |
// hierarchy, the wx[V/H/HV]ScrolledWindow classes are slightly |
// more complex (compare with the diagram outlined in           |
// scrolwin.h) for the purpose of reducing code duplication     |
// through the use of mix-in classes.                           |
//                                                              |
//                   wxAnyScrollHelperBase                      |
//                            |                                 |
//                            |                                 |
//                            |                                 |
//                            V                                 |
//                  wxVarScrollHelperBase                       |
//                   /                 \                        |
//                  /                   \                       |
//                 V                     V                      |
//  wxVarHScrollHelper                 wxVarVScrollHelper       |
//       |          \                   /           |           |
//       |           \                 /            |           |
//       |            V               V             |           |
//       |           wxVarHVScrollHelper            |           |
//       |                      |                   |           |
//       |                      |                   V           |
//       |         wxPanel      |    wxVarVScrollLegacyAdaptor  |
//       |         /  \  \      |                   |           |
//       |        /    \  `-----|----------.        |           |
//       |       /      \       |           \       |           |
//       |      /        \      |            \      |           |
//       V     V          \     |             V     V           |
//  wxHScrolledWindow      \    |        wxVScrolledWindow      |
//                          V   V                               |
//                    wxHVScrolledWindow                        |
//                                                              |
//                                                              |
//   Border added to suppress GCC multi-line comment warnings ->|


// ===========================================================================
// wxVarScrollHelperBase
// ===========================================================================

// Provides all base common scroll calculations needed for either orientation,
// automatic scrollbar functionality, saved scroll positions, functionality
// for changing the target window to be scrolled, as well as defining all
// required virtual functions that need to be implemented for any orientation
// specific work.

class WXDLLIMPEXP_CORE wxVarScrollHelperBase : public wxAnyScrollHelperBase
{
public:
    // constructors and such
    // ---------------------

    wxVarScrollHelperBase(wxWindow *winToScroll);
    virtual ~wxVarScrollHelperBase();

    // operations
    // ----------

    // with physical scrolling on, the device origin is changed properly when
    // a wxPaintDC is prepared, children are actually moved and laid out
    // properly, and the contents of the window (pixels) are actually moved
    void EnablePhysicalScrolling(bool scrolling = true)
        { m_physicalScrolling = scrolling; }

    // wxNOT_FOUND if none, i.e. if it is below the last item
    int VirtualHitTest(wxCoord coord) const;

    // recalculate all our parameters and redisplay all units
    virtual void RefreshAll();

    // accessors
    // ---------

    // get the first currently visible unit
    size_t GetVisibleBegin() const { return m_unitFirst; }

    // get the last currently visible unit
    size_t GetVisibleEnd() const
        { return m_unitFirst + m_nUnitsVisible; }

    // is this unit currently visible?
    bool IsVisible(size_t unit) const
        { return unit >= m_unitFirst && unit < GetVisibleEnd(); }

    // translate between scrolled and unscrolled coordinates
    int CalcScrolledPosition(int coord) const
        {  return DoCalcScrolledPosition(coord); }
    int CalcUnscrolledPosition(int coord) const
        {  return DoCalcUnscrolledPosition(coord); }

    virtual int DoCalcScrolledPosition(int coord) const;
    virtual int DoCalcUnscrolledPosition(int coord) const;

    // update the thumb size shown by the scrollbar
    virtual void UpdateScrollbar();
    void RemoveScrollbar();

    // Normally the wxScrolledWindow will scroll itself, but in some rare
    // occasions you might want it to scroll [part of] another window (e.g. a
    // child of it in order to scroll only a portion the area between the
    // scrollbars (spreadsheet: only cell area will move).
    virtual void SetTargetWindow(wxWindow *target);

    // change the DC origin according to the scroll position. To properly
    // forward calls to wxWindow::Layout use WX_FORWARD_TO_SCROLL_HELPER()
    // derived class
    virtual void DoPrepareDC(wxDC& dc);

    // the methods to be called from the window event handlers
    void HandleOnScroll(wxScrollWinEvent& event);
    void HandleOnSize(wxSizeEvent& event);
#if wxUSE_MOUSEWHEEL
    void HandleOnMouseWheel(wxMouseEvent& event);
#endif // wxUSE_MOUSEWHEEL

    // these functions must be overidden in the derived class to return
    // orientation specific data (e.g. the width for vertically scrolling
    // derivatives in the case of GetOrientationTargetSize())
    virtual int GetOrientationTargetSize() const = 0;
    virtual int GetNonOrientationTargetSize() const = 0;
    virtual wxOrientation GetOrientation() const = 0;

protected:
    // all *Unit* functions are protected to be exposed by
    // wxVarScrollHelperBase implementations (with appropriate names)

    // get the number of units this window contains (previously set by
    // SetUnitCount())
    size_t GetUnitCount() const { return m_unitMax; }

    // set the number of units the helper contains: the derived class must
    // provide the sizes for all units with indices up to the one given here
    // in its OnGetUnitSize()
    void SetUnitCount(size_t count);

    // redraw the specified unit
    virtual void RefreshUnit(size_t unit);

    // redraw all units in the specified range (inclusive)
    virtual void RefreshUnits(size_t from, size_t to);

    // scroll to the specified unit: it will become the first visible unit in
    // the window
    //
    // return true if we scrolled the window, false if nothing was done
    bool DoScrollToUnit(size_t unit);

    // scroll by the specified number of units/pages
    virtual bool DoScrollUnits(int units);
    virtual bool DoScrollPages(int pages);

    // this function must be overridden in the derived class and it should
    // return the size of the given unit in pixels
    virtual wxCoord OnGetUnitSize(size_t n) const = 0;

    // this function doesn't have to be overridden but it may be useful to do
    // it if calculating the units' sizes is a relatively expensive operation
    // as it gives the user code a possibility to calculate several of them at
    // once
    //
    // OnGetUnitsSizeHint() is normally called just before OnGetUnitSize() but
    // you shouldn't rely on the latter being called for all units in the
    // interval specified here. It is also possible that OnGetUnitHeight() will
    // be called for the units outside of this interval, so this is really just
    // a hint, not a promise.
    //
    // finally note that unitMin is inclusive, while unitMax is exclusive, as
    // usual
    virtual void OnGetUnitsSizeHint(size_t WXUNUSED(unitMin),
                                    size_t WXUNUSED(unitMax)) const
        { }

    // when the number of units changes, we try to estimate the total size
    // of all units which is a rather expensive operation in terms of unit
    // access, so if the user code may estimate the average size
    // better/faster than we do, it should override this function to implement
    // its own logic
    //
    // this function should return the best guess for the total size it may
    // make
    virtual wxCoord EstimateTotalSize() const { return DoEstimateTotalSize(); }

    wxCoord DoEstimateTotalSize() const;

    // find the index of the unit we need to show to fit the specified unit on
    // the opposite side either fully or partially (depending on fullyVisible)
    size_t FindFirstVisibleFromLast(size_t last,
                                    bool fullyVisible = false) const;

    // get the total size of the units between unitMin (inclusive) and
    // unitMax (exclusive)
    wxCoord GetUnitsSize(size_t unitMin, size_t unitMax) const;

    // get the offset of the first visible unit
    wxCoord GetScrollOffset() const
        { return GetUnitsSize(0, GetVisibleBegin()); }

    // get the size of the target window
    wxSize GetTargetSize() const { return m_targetWindow->GetClientSize(); }

    void GetTargetSize(int *w, int *h)
    {
        wxSize size = GetTargetSize();
        if ( w )
            *w = size.x;
        if ( h )
            *h = size.y;
    }

    // calculate the new scroll position based on scroll event type
    size_t GetNewScrollPosition(wxScrollWinEvent& event) const;

    // replacement implementation of wxWindow::Layout virtual method.  To
    // properly forward calls to wxWindow::Layout use
    // WX_FORWARD_TO_SCROLL_HELPER() derived class
    bool ScrollLayout();

#ifdef __WXMAC__
    // queue mac window update after handling scroll event
    virtual void UpdateMacScrollWindow() { }
#endif // __WXMAC__

    // change the target window
    void DoSetTargetWindow(wxWindow *target);

    // delete the event handler we installed
    void DeleteEvtHandler();

    // helper function abstracting the orientation test: with vertical
    // orientation, it assigns the first value to x and the second one to y,
    // with horizontal orientation it reverses them, i.e. the first value is
    // assigned to y and the second one to x
    void AssignOrient(wxCoord& x, wxCoord& y, wxCoord first, wxCoord second);

    // similar to "oriented assignment" above but does "oriented increment":
    // for vertical orientation, y is incremented by the given value and x if
    // left unchanged, for horizontal orientation x is incremented
    void IncOrient(wxCoord& x, wxCoord& y, wxCoord inc);

private:
    // the total number of (logical) units
    size_t m_unitMax;

    // the total (estimated) size
    wxCoord m_sizeTotal;

    // the first currently visible unit
    size_t m_unitFirst;

    // the number of currently visible units (including the last, possibly only
    // partly, visible one)
    size_t m_nUnitsVisible;

    // accumulated mouse wheel rotation
#if wxUSE_MOUSEWHEEL
    int m_sumWheelRotation;
#endif

    // do child scrolling (used in DoPrepareDC())
    bool m_physicalScrolling;

    // handler injected into target window to forward some useful events to us
    wxVarScrollHelperEvtHandler *m_handler;
};



// ===========================================================================
// wxVarVScrollHelper
// ===========================================================================

// Provides public API functions targeted for vertical-specific scrolling,
// wrapping the functionality of wxVarScrollHelperBase.

class WXDLLIMPEXP_CORE wxVarVScrollHelper : public wxVarScrollHelperBase
{
public:
    // constructors and such
    // ---------------------

    // ctor must be given the associated window
    wxVarVScrollHelper(wxWindow *winToScroll)
        : wxVarScrollHelperBase(winToScroll)
    {
    }

    // operators

    void SetRowCount(size_t rowCount) { SetUnitCount(rowCount); }
    bool ScrollToRow(size_t row) { return DoScrollToUnit(row); }

    virtual bool ScrollRows(int rows)
        { return DoScrollUnits(rows); }
    virtual bool ScrollRowPages(int pages)
        { return DoScrollPages(pages); }

    virtual void RefreshRow(size_t row)
        { RefreshUnit(row); }
    virtual void RefreshRows(size_t from, size_t to)
        { RefreshUnits(from, to); }

    // accessors

    size_t GetRowCount() const                  { return GetUnitCount(); }
    size_t GetVisibleRowsBegin() const          { return GetVisibleBegin(); }
    size_t GetVisibleRowsEnd() const            { return GetVisibleEnd(); }
    bool IsRowVisible(size_t row) const         { return IsVisible(row); }

    virtual int GetOrientationTargetSize() const
        { return GetTargetWindow()->GetClientSize().y; }
    virtual int GetNonOrientationTargetSize() const
        { return GetTargetWindow()->GetClientSize().x; }
    virtual wxOrientation GetOrientation() const { return wxVERTICAL; }

protected:
    // this function must be overridden in the derived class and it should
    // return the size of the given row in pixels
    virtual wxCoord OnGetRowHeight(size_t n) const = 0;
    wxCoord OnGetUnitSize(size_t n) const       { return OnGetRowHeight(n); }

    virtual void OnGetRowsHeightHint(size_t WXUNUSED(rowMin),
                                     size_t WXUNUSED(rowMax)) const { }

    // forward calls to OnGetRowsHeightHint()
    virtual void OnGetUnitsSizeHint(size_t unitMin, size_t unitMax) const
        { OnGetRowsHeightHint(unitMin, unitMax); }

    // again, if not overridden, it will fall back on default method
    virtual wxCoord EstimateTotalHeight() const
        { return DoEstimateTotalSize(); }

    // forward calls to EstimateTotalHeight()
    virtual wxCoord EstimateTotalSize() const { return EstimateTotalHeight(); }

    wxCoord GetRowsHeight(size_t rowMin, size_t rowMax) const
        { return GetUnitsSize(rowMin, rowMax); }
};



// ===========================================================================
// wxVarHScrollHelper
// ===========================================================================

// Provides public API functions targeted for horizontal-specific scrolling,
// wrapping the functionality of wxVarScrollHelperBase.

class WXDLLIMPEXP_CORE wxVarHScrollHelper : public wxVarScrollHelperBase
{
public:
    // constructors and such
    // ---------------------

    // ctor must be given the associated window
    wxVarHScrollHelper(wxWindow *winToScroll)
        : wxVarScrollHelperBase(winToScroll)
    {
    }

    // operators

    void SetColumnCount(size_t columnCount)
        { SetUnitCount(columnCount); }

    bool ScrollToColumn(size_t column)
        { return DoScrollToUnit(column); }
    virtual bool ScrollColumns(int columns)
        { return DoScrollUnits(columns); }
    virtual bool ScrollColumnPages(int pages)
        { return DoScrollPages(pages); }

    virtual void RefreshColumn(size_t column)
        { RefreshUnit(column); }
    virtual void RefreshColumns(size_t from, size_t to)
        { RefreshUnits(from, to); }

    // accessors

    size_t GetColumnCount() const
        { return GetUnitCount(); }
    size_t GetVisibleColumnsBegin() const
        { return GetVisibleBegin(); }
    size_t GetVisibleColumnsEnd() const
        { return GetVisibleEnd(); }
    bool IsColumnVisible(size_t column) const
        { return IsVisible(column); }


    virtual int GetOrientationTargetSize() const
        { return GetTargetWindow()->GetClientSize().x; }
    virtual int GetNonOrientationTargetSize() const
        { return GetTargetWindow()->GetClientSize().y; }
    virtual wxOrientation GetOrientation() const   { return wxHORIZONTAL; }

protected:
    // this function must be overridden in the derived class and it should
    // return the size of the given column in pixels
    virtual wxCoord OnGetColumnWidth(size_t n) const = 0;
    wxCoord OnGetUnitSize(size_t n) const { return OnGetColumnWidth(n); }

    virtual void OnGetColumnsWidthHint(size_t WXUNUSED(columnMin),
                                        size_t WXUNUSED(columnMax)) const
        { }

    // forward calls to OnGetColumnsWidthHint()
    virtual void OnGetUnitsSizeHint(size_t unitMin, size_t unitMax) const
        { OnGetColumnsWidthHint(unitMin, unitMax); }

    // again, if not overridden, it will fall back on default method
    virtual wxCoord EstimateTotalWidth() const { return DoEstimateTotalSize(); }

    // forward calls to EstimateTotalWidth()
    virtual wxCoord EstimateTotalSize() const { return EstimateTotalWidth(); }

    wxCoord GetColumnsWidth(size_t columnMin, size_t columnMax) const
        { return GetUnitsSize(columnMin, columnMax); }
};



// ===========================================================================
// wxVarHVScrollHelper
// ===========================================================================

// Provides public API functions targeted at functions with similar names in
// both wxVScrollHelper and wxHScrollHelper so class scope doesn't need to be
// specified (since we are using multiple inheritance). It also provides
// functions to make changing values for both orientations at the same time
// easier.

class WXDLLIMPEXP_CORE wxVarHVScrollHelper : public wxVarVScrollHelper,
                                        public wxVarHScrollHelper
{
public:
    // constructors and such
    // ---------------------

    // ctor must be given the associated window
    wxVarHVScrollHelper(wxWindow *winToScroll)
        : wxVarVScrollHelper(winToScroll), wxVarHScrollHelper(winToScroll) { }

    // operators
    // ---------

    // set the number of units the window contains for each axis: the derived
    // class must provide the widths and heights for all units with indices up
    // to each of the one given here in its OnGetColumnWidth() and
    // OnGetRowHeight()
    void SetRowColumnCount(size_t rowCount, size_t columnCount);


    // with physical scrolling on, the device origin is changed properly when
    // a wxPaintDC is prepared, children are actually moved and laid out
    // properly, and the contents of the window (pixels) are actually moved
    void EnablePhysicalScrolling(bool vscrolling = true, bool hscrolling = true)
    {
        wxVarVScrollHelper::EnablePhysicalScrolling(vscrolling);
        wxVarHScrollHelper::EnablePhysicalScrolling(hscrolling);
    }

    // scroll to the specified row/column: it will become the first visible
    // cell in the window
    //
    // return true if we scrolled the window, false if nothing was done
    bool ScrollToRowColumn(size_t row, size_t column);
    bool ScrollToRowColumn(const wxPosition &pos)
        { return ScrollToRowColumn(pos.GetRow(), pos.GetColumn()); }

    // redraw the specified cell
    virtual void RefreshRowColumn(size_t row, size_t column);
    virtual void RefreshRowColumn(const wxPosition &pos)
        { RefreshRowColumn(pos.GetRow(), pos.GetColumn()); }

    // redraw the specified regions (inclusive).  If the target window for
    // both orientations is the same the rectangle of cells is refreshed; if
    // the target windows differ the entire client size opposite the
    // orientation direction is refreshed between the specified limits
    virtual void RefreshRowsColumns(size_t fromRow, size_t toRow,
                                    size_t fromColumn, size_t toColumn);
    virtual void RefreshRowsColumns(const wxPosition& from,
                                    const wxPosition& to)
    {
        RefreshRowsColumns(from.GetRow(), to.GetRow(),
                          from.GetColumn(), to.GetColumn());
    }

    // locate the virtual position from the given device coordinates
    wxPosition VirtualHitTest(wxCoord x, wxCoord y) const;
    wxPosition VirtualHitTest(const wxPoint &pos) const
        { return VirtualHitTest(pos.x, pos.y); }

    // change the DC origin according to the scroll position. To properly
    // forward calls to wxWindow::Layout use WX_FORWARD_TO_SCROLL_HELPER()
    // derived class. We use this version to call both base classes'
    // DoPrepareDC()
    virtual void DoPrepareDC(wxDC& dc);

    // replacement implementation of wxWindow::Layout virtual method.  To
    // properly forward calls to wxWindow::Layout use
    // WX_FORWARD_TO_SCROLL_HELPER() derived class. We use this version to
    // call both base classes' ScrollLayout()
    bool ScrollLayout();

    // accessors
    // ---------

    // get the number of units this window contains (previously set by
    // Set[Column/Row/RowColumn/Unit]Count())
    wxSize GetRowColumnCount() const;

    // get the first currently visible units
    wxPosition GetVisibleBegin() const;
    wxPosition GetVisibleEnd() const;

    // is this cell currently visible?
    bool IsVisible(size_t row, size_t column) const;
    bool IsVisible(const wxPosition &pos) const
        { return IsVisible(pos.GetRow(), pos.GetColumn()); }
};



#if WXWIN_COMPATIBILITY_2_8

// ===========================================================================
// wxVarVScrollLegacyAdaptor
// ===========================================================================

// Provides backwards compatible API for applications originally built using
// wxVScrolledWindow in 2.6 or 2.8. Originally, wxVScrolledWindow referred
// to scrolling "lines". We use "units" in wxVarScrollHelperBase to avoid
// implying any orientation (since the functions are used for both horizontal
// and vertical scrolling in derived classes). And in the new
// wxVScrolledWindow and wxHScrolledWindow classes, we refer to them as
// "rows" and "columns", respectively. This is to help clear some confusion
// in not only those classes, but also in wxHVScrolledWindow where functions
// are inherited from both.

class WXDLLIMPEXP_CORE wxVarVScrollLegacyAdaptor : public wxVarVScrollHelper
{
public:
    // constructors and such
    // ---------------------
    wxVarVScrollLegacyAdaptor(wxWindow *winToScroll)
        : wxVarVScrollHelper(winToScroll)
    {
    }

    // accessors
    // ---------

    // this is the same as GetVisibleRowsBegin(), exists to match
    // GetLastVisibleLine() and for backwards compatibility only
    wxDEPRECATED( size_t GetFirstVisibleLine() const );

    // get the last currently visible line
    //
    // this function is unsafe as it returns (size_t)-1 (i.e. a huge positive
    // number) if the control is empty, use GetVisibleRowsEnd() instead, this
    // one is kept for backwards compatibility
    wxDEPRECATED( size_t GetLastVisibleLine() const );

    // "line" to "unit" compatibility functions
    // ----------------------------------------

    // get the number of lines this window contains (set by SetLineCount())
    wxDEPRECATED( size_t GetLineCount() const );

    // set the number of lines the helper contains: the derived class must
    // provide the sizes for all lines with indices up to the one given here
    // in its OnGetLineHeight()
    wxDEPRECATED( void SetLineCount(size_t count) );

    // redraw the specified line
    wxDEPRECATED( virtual void RefreshLine(size_t line) );

    // redraw all lines in the specified range (inclusive)
    wxDEPRECATED( virtual void RefreshLines(size_t from, size_t to) );

    // scroll to the specified line: it will become the first visible line in
    // the window
    //
    // return true if we scrolled the window, false if nothing was done
    wxDEPRECATED( bool ScrollToLine(size_t line) );

    // scroll by the specified number of lines/pages
    wxDEPRECATED( virtual bool ScrollLines(int lines) );
    wxDEPRECATED( virtual bool ScrollPages(int pages) );

protected:
    // unless the code has been updated to override OnGetRowHeight() instead,
    // this function must be overridden in the derived class and it should
    // return the height of the given row in pixels
    wxDEPRECATED_BUT_USED_INTERNALLY(
        virtual wxCoord OnGetLineHeight(size_t n) const );

    // forwards the calls from base class pure virtual function to pure virtual
    // OnGetLineHeight instead (backwards compatible name)
    // note that we don't need to forward OnGetUnitSize() as it is already
    // forwarded to OnGetRowHeight() in wxVarVScrollHelper
    virtual wxCoord OnGetRowHeight(size_t n) const;

    // this function doesn't have to be overridden but it may be useful to do
    // it if calculating the lines heights is a relatively expensive operation
    // as it gives the user code a possibility to calculate several of them at
    // once
    //
    // OnGetLinesHint() is normally called just before OnGetLineHeight() but you
    // shouldn't rely on the latter being called for all lines in the interval
    // specified here. It is also possible that OnGetLineHeight() will be
    // called for the lines outside of this interval, so this is really just a
    // hint, not a promise.
    //
    // finally note that lineMin is inclusive, while lineMax is exclusive, as
    // usual
    wxDEPRECATED_BUT_USED_INTERNALLY( virtual void OnGetLinesHint(
        size_t lineMin, size_t lineMax) const );

    // forwards the calls from base class pure virtual function to pure virtual
    // OnGetLinesHint instead (backwards compatible name)
    void OnGetRowsHeightHint(size_t rowMin, size_t rowMax) const;
};

#else // !WXWIN_COMPATIBILITY_2_8

// shortcut to avoid checking compatibility modes later
// remove this and all references to wxVarVScrollLegacyAdaptor once
// wxWidgets 2.6 and 2.8 compatibility is removed
typedef wxVarVScrollHelper wxVarVScrollLegacyAdaptor;

#endif // WXWIN_COMPATIBILITY_2_8/!WXWIN_COMPATIBILITY_2_8


// this macro must be used in declaration of wxVarScrollHelperBase-derived
// classes
#define WX_FORWARD_TO_VAR_SCROLL_HELPER()                                     \
public:                                                                       \
    virtual void PrepareDC(wxDC& dc) { DoPrepareDC(dc); }                     \
    virtual bool Layout() { return ScrollLayout(); }



// ===========================================================================
// wxVScrolledWindow
// ===========================================================================

// In the name of this class, "V" may stand for "variable" because it can be
// used for scrolling rows of variable heights; "virtual", because it is not
// necessary to know the heights of all rows in advance -- only those which
// are shown on the screen need to be measured; or even "vertical", because
// this class only supports scrolling vertically.

// In any case, this is a generalization of the wxScrolledWindow class which
// can be only used when all rows have the same heights. It lacks some other
// wxScrolledWindow features however, notably it can't scroll only a rectangle
// of the window and not its entire client area.

class WXDLLIMPEXP_CORE wxVScrolledWindow : public wxPanel,
                                      public wxVarVScrollLegacyAdaptor
{
public:
    // constructors and such
    // ---------------------

    // default ctor, you must call Create() later
    wxVScrolledWindow() : wxVarVScrollLegacyAdaptor(this) { }

    // normal ctor, no need to call Create() after this one
    //
    // note that wxVSCROLL is always automatically added to our style, there is
    // no need to specify it explicitly
    wxVScrolledWindow(wxWindow *parent,
                      wxWindowID id = wxID_ANY,
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& size = wxDefaultSize,
                      long style = 0,
                      const wxString& name = wxPanelNameStr)
    : wxVarVScrollLegacyAdaptor(this)
    {
        (void)Create(parent, id, pos, size, style, name);
    }

    // same as the previous ctor but returns status code: true if ok
    //
    // just as with the ctor above, wxVSCROLL style is always used, there is no
    // need to specify it
    bool Create(wxWindow *parent,
                wxWindowID id = wxID_ANY,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
                long style = 0,
                const wxString& name = wxPanelNameStr)
    {
        return wxPanel::Create(parent, id, pos, size, style | wxVSCROLL, name);
    }

#if WXWIN_COMPATIBILITY_2_8
    // Make sure we prefer our version of HitTest rather than wxWindow's
    // These functions should no longer be masked in favor of VirtualHitTest()
    int HitTest(wxCoord WXUNUSED(x), wxCoord y) const
        { return wxVarVScrollHelper::VirtualHitTest(y); }
    int HitTest(const wxPoint& pt) const
        { return HitTest(pt.x, pt.y); }
#endif // WXWIN_COMPATIBILITY_2_8

    WX_FORWARD_TO_VAR_SCROLL_HELPER()

#ifdef __WXMAC__
protected:
    virtual void UpdateMacScrollWindow() { Update(); }
#endif // __WXMAC__

private:
    wxDECLARE_NO_COPY_CLASS(wxVScrolledWindow);
    DECLARE_ABSTRACT_CLASS(wxVScrolledWindow)
};



// ===========================================================================
// wxHScrolledWindow
// ===========================================================================

// In the name of this class, "H" stands for "horizontal" because it can be
// used for scrolling columns of variable widths. It is not necessary to know
// the widths of all columns in advance -- only those which are shown on the
// screen need to be measured.

// This is a generalization of the wxScrolledWindow class which can be only
// used when all columns have the same width. It lacks some other
// wxScrolledWindow features however, notably it can't scroll only a rectangle
// of the window and not its entire client area.

class WXDLLIMPEXP_CORE wxHScrolledWindow : public wxPanel,
                                      public wxVarHScrollHelper
{
public:
    // constructors and such
    // ---------------------

    // default ctor, you must call Create() later
    wxHScrolledWindow() : wxVarHScrollHelper(this) { }

    // normal ctor, no need to call Create() after this one
    //
    // note that wxHSCROLL is always automatically added to our style, there is
    // no need to specify it explicitly
    wxHScrolledWindow(wxWindow *parent,
                      wxWindowID id = wxID_ANY,
                      const wxPoint& pos = wxDefaultPosition,
                      const wxSize& size = wxDefaultSize,
                      long style = 0,
                      const wxString& name = wxPanelNameStr)
        : wxVarHScrollHelper(this)
    {
        (void)Create(parent, id, pos, size, style, name);
    }

    // same as the previous ctor but returns status code: true if ok
    //
    // just as with the ctor above, wxHSCROLL style is always used, there is no
    // need to specify it
    bool Create(wxWindow *parent,
                wxWindowID id = wxID_ANY,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
                long style = 0,
                const wxString& name = wxPanelNameStr)
    {
        return wxPanel::Create(parent, id, pos, size, style | wxHSCROLL, name);
    }

    WX_FORWARD_TO_VAR_SCROLL_HELPER()

#ifdef __WXMAC__
protected:
    virtual void UpdateMacScrollWindow() { Update(); }
#endif // __WXMAC__

private:
    wxDECLARE_NO_COPY_CLASS(wxHScrolledWindow);
    DECLARE_ABSTRACT_CLASS(wxHScrolledWindow)
};



// ===========================================================================
// wxHVScrolledWindow
// ===========================================================================

// This window inherits all functionality of both vertical and horizontal
// scrolled windows automatically handling everything needed to scroll both
// axis simultaneously.

class WXDLLIMPEXP_CORE wxHVScrolledWindow : public wxPanel,
                                       public wxVarHVScrollHelper
{
public:
    // constructors and such
    // ---------------------

    // default ctor, you must call Create() later
    wxHVScrolledWindow()
        : wxPanel(),
          wxVarHVScrollHelper(this) { }

    // normal ctor, no need to call Create() after this one
    //
    // note that wxVSCROLL and wxHSCROLL are always automatically added to our
    // style, there is no need to specify them explicitly
    wxHVScrolledWindow(wxWindow *parent,
                       wxWindowID id = wxID_ANY,
                       const wxPoint& pos = wxDefaultPosition,
                       const wxSize& size = wxDefaultSize,
                       long style = 0,
                       const wxString& name = wxPanelNameStr)
        : wxPanel(),
          wxVarHVScrollHelper(this)
    {
        (void)Create(parent, id, pos, size, style, name);
    }

    // same as the previous ctor but returns status code: true if ok
    //
    // just as with the ctor above, wxVSCROLL and wxHSCROLL styles are always
    // used, there is no need to specify them
    bool Create(wxWindow *parent,
                wxWindowID id = wxID_ANY,
                const wxPoint& pos = wxDefaultPosition,
                const wxSize& size = wxDefaultSize,
                long style = 0,
                const wxString& name = wxPanelNameStr)
    {
        return wxPanel::Create(parent, id, pos, size,
                               style | wxVSCROLL | wxHSCROLL, name);
    }

    WX_FORWARD_TO_VAR_SCROLL_HELPER()

#ifdef __WXMAC__
protected:
    virtual void UpdateMacScrollWindow() { Update(); }
#endif // __WXMAC__

private:
    wxDECLARE_NO_COPY_CLASS(wxHVScrolledWindow);
    DECLARE_ABSTRACT_CLASS(wxHVScrolledWindow)
};

#endif // _WX_VSCROLL_H_