| 1 | ///////////////////////////////////////////////////////////////////////////// |
| 2 | // Name: wx/gtk/scrolwin.h |
| 3 | // Purpose: wxScrolledWindow class |
| 4 | // Author: Robert Roebling |
| 5 | // Modified by: |
| 6 | // Created: 01/02/97 |
| 7 | // RCS-ID: $Id$ |
| 8 | // Copyright: (c) Robert Roebling |
| 9 | // Licence: wxWindows licence |
| 10 | ///////////////////////////////////////////////////////////////////////////// |
| 11 | |
| 12 | #ifndef _WX_GTK_SCROLLWIN_H_ |
| 13 | #define _WX_GTK_SCROLLWIN_H_ |
| 14 | |
| 15 | #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) |
| 16 | #pragma interface "scrolwin.h" |
| 17 | #endif |
| 18 | |
| 19 | // ---------------------------------------------------------------------------- |
| 20 | // headers and constants |
| 21 | // ---------------------------------------------------------------------------- |
| 22 | |
| 23 | #include "wx/window.h" |
| 24 | #include "wx/panel.h" |
| 25 | |
| 26 | WXDLLEXPORT_DATA(extern const wxChar*) wxPanelNameStr; |
| 27 | |
| 28 | // default scrolled window style |
| 29 | #ifndef wxScrolledWindowStyle |
| 30 | #define wxScrolledWindowStyle (wxHSCROLL | wxVSCROLL) |
| 31 | #endif |
| 32 | |
| 33 | // ---------------------------------------------------------------------------- |
| 34 | // wxScrolledWindow |
| 35 | // ---------------------------------------------------------------------------- |
| 36 | |
| 37 | class WXDLLEXPORT wxScrolledWindow : public wxPanel |
| 38 | { |
| 39 | public: |
| 40 | wxScrolledWindow() |
| 41 | { Init(); } |
| 42 | |
| 43 | wxScrolledWindow(wxWindow *parent, |
| 44 | wxWindowID id = -1, |
| 45 | const wxPoint& pos = wxDefaultPosition, |
| 46 | const wxSize& size = wxDefaultSize, |
| 47 | long style = wxScrolledWindowStyle, |
| 48 | const wxString& name = wxPanelNameStr) |
| 49 | { Create(parent, id, pos, size, style, name); } |
| 50 | |
| 51 | void Init(); |
| 52 | |
| 53 | bool Create(wxWindow *parent, |
| 54 | wxWindowID id, |
| 55 | const wxPoint& pos = wxDefaultPosition, |
| 56 | const wxSize& size = wxDefaultSize, |
| 57 | long style = wxScrolledWindowStyle, |
| 58 | const wxString& name = wxPanelNameStr); |
| 59 | |
| 60 | // Normally the wxScrolledWindow will scroll itself, but in |
| 61 | // some rare occasions you might want it to scroll another |
| 62 | // window (e.g. a child of it in order to scroll only a portion |
| 63 | // the area between the scrollbars (spreadsheet: only cell area |
| 64 | // will move). |
| 65 | virtual void SetTargetWindow( wxWindow *target, bool pushEventHandler = FALSE ); |
| 66 | virtual wxWindow *GetTargetWindow() const; |
| 67 | |
| 68 | // Set the scrolled area of the window. |
| 69 | virtual void DoSetVirtualSize( int x, int y ); |
| 70 | |
| 71 | // Set the x, y scrolling increments. |
| 72 | void SetScrollRate( int xstep, int ystep ); |
| 73 | |
| 74 | // Number of pixels per user unit (0 or -1 for no scrollbar) |
| 75 | // Length of virtual canvas in user units |
| 76 | // Length of page in user units |
| 77 | // Default action is to set the virtual size and alter scrollbars |
| 78 | // accordingly. |
| 79 | virtual void SetScrollbars(int pixelsPerUnitX, int pixelsPerUnitY, |
| 80 | int noUnitsX, int noUnitsY, |
| 81 | int xPos = 0, int yPos = 0, |
| 82 | bool noRefresh = FALSE ); |
| 83 | |
| 84 | // Physically scroll the window |
| 85 | virtual void Scroll(int x_pos, int y_pos); |
| 86 | |
| 87 | int GetScrollPageSize(int orient) const; |
| 88 | void SetScrollPageSize(int orient, int pageSize); |
| 89 | |
| 90 | virtual void GetScrollPixelsPerUnit(int *x_unit, int *y_unit) const; |
| 91 | |
| 92 | // Enable/disable Windows scrolling in either direction. |
| 93 | // If TRUE, wxWindows scrolls the canvas and only a bit of |
| 94 | // the canvas is invalidated; no Clear() is necessary. |
| 95 | // If FALSE, the whole canvas is invalidated and a Clear() is |
| 96 | // necessary. Disable for when the scroll increment is used |
| 97 | // to actually scroll a non-constant distance |
| 98 | virtual void EnableScrolling(bool x_scrolling, bool y_scrolling); |
| 99 | |
| 100 | // Get the view start |
| 101 | virtual void GetViewStart(int *x, int *y) const; |
| 102 | |
| 103 | // translate between scrolled and unscrolled coordinates |
| 104 | void CalcScrolledPosition(int x, int y, int *xx, int *yy) const |
| 105 | { DoCalcScrolledPosition(x, y, xx, yy); } |
| 106 | wxPoint CalcScrolledPosition(const wxPoint& pt) const |
| 107 | { |
| 108 | wxPoint p2; |
| 109 | DoCalcScrolledPosition(pt.x, pt.y, &p2.x, &p2.y); |
| 110 | return p2; |
| 111 | } |
| 112 | |
| 113 | void CalcUnscrolledPosition(int x, int y, int *xx, int *yy) const |
| 114 | { DoCalcUnscrolledPosition(x, y, xx, yy); } |
| 115 | wxPoint CalcUnscrolledPosition(const wxPoint& pt) const |
| 116 | { |
| 117 | wxPoint p2; |
| 118 | DoCalcUnscrolledPosition(pt.x, pt.y, &p2.x, &p2.y); |
| 119 | return p2; |
| 120 | } |
| 121 | |
| 122 | virtual void DoCalcScrolledPosition(int x, int y, int *xx, int *yy) const; |
| 123 | virtual void DoCalcUnscrolledPosition(int x, int y, int *xx, int *yy) const; |
| 124 | |
| 125 | // Override this function to draw the graphic (or just process EVT_PAINT) |
| 126 | virtual void OnDraw(wxDC& WXUNUSED(dc)) {} |
| 127 | |
| 128 | // Override this function if you don't want to have wxScrolledWindow |
| 129 | // automatically change the origin according to the scroll position. |
| 130 | virtual void PrepareDC(wxDC& dc); |
| 131 | |
| 132 | // lay out the window and its children |
| 133 | virtual bool Layout(); |
| 134 | |
| 135 | // Adjust the scrollbars |
| 136 | virtual void AdjustScrollbars(); |
| 137 | |
| 138 | // Set the scale factor, used in PrepareDC |
| 139 | void SetScale(double xs, double ys) { m_scaleX = xs; m_scaleY = ys; } |
| 140 | double GetScaleX() const { return m_scaleX; } |
| 141 | double GetScaleY() const { return m_scaleY; } |
| 142 | |
| 143 | // implementation from now on |
| 144 | void OnScroll(wxScrollWinEvent& event); |
| 145 | void OnSize(wxSizeEvent& event); |
| 146 | void OnPaint(wxPaintEvent& event); |
| 147 | void OnChar(wxKeyEvent& event); |
| 148 | |
| 149 | void GtkVScroll( float value, unsigned int scroll_type ); |
| 150 | void GtkHScroll( float value, unsigned int scroll_type ); |
| 151 | void GtkVConnectEvent(); |
| 152 | void GtkHConnectEvent(); |
| 153 | void GtkVDisconnectEvent(); |
| 154 | void GtkHDisconnectEvent(); |
| 155 | |
| 156 | // Calculate scroll increment |
| 157 | virtual int CalcScrollInc(wxScrollWinEvent& event); |
| 158 | |
| 159 | // Overridden from wxWindows due callback being static |
| 160 | virtual void SetScrollPos( int orient, int pos, bool refresh = TRUE ); |
| 161 | |
| 162 | #if WXWIN_COMPATIBILITY_2_2 |
| 163 | // Compatibility |
| 164 | void ViewStart(int *x, int *y) const { GetViewStart( x, y ); } |
| 165 | #endif // WXWIN_COMPATIBILITY_2_2 |
| 166 | |
| 167 | protected: |
| 168 | wxWindow *m_targetWindow; |
| 169 | int m_xScrollPixelsPerLine; |
| 170 | int m_yScrollPixelsPerLine; |
| 171 | bool m_xScrollingEnabled; |
| 172 | bool m_yScrollingEnabled; |
| 173 | |
| 174 | // FIXME: these next four members are duplicated in the GtkAdjustment |
| 175 | // members of wxWindow. Can they be safely removed from here? |
| 176 | |
| 177 | int m_xScrollPosition; |
| 178 | int m_yScrollPosition; |
| 179 | int m_xScrollLinesPerPage; |
| 180 | int m_yScrollLinesPerPage; |
| 181 | |
| 182 | double m_scaleY,m_scaleX; |
| 183 | |
| 184 | private: |
| 185 | DECLARE_EVENT_TABLE() |
| 186 | DECLARE_ABSTRACT_CLASS(wxScrolledWindow) |
| 187 | }; |
| 188 | |
| 189 | #endif |
| 190 | // _WX_GTK_SCROLLWIN_H_ |
| 191 | |
| 192 | // vi:sts=4:sw=4:et |