]> git.saurik.com Git - wxWidgets.git/commitdiff
1. made ScrollLines/Pages return bool indicating if we scrolled till the
authorVadim Zeitlin <vadim@wxwidgets.org>
Mon, 30 Jul 2001 15:22:38 +0000 (15:22 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Mon, 30 Jul 2001 15:22:38 +0000 (15:22 +0000)
   end or not
2. implemented them for wxGTK text ctrl

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11215 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/window.tex
include/wx/gtk/textctrl.h
include/wx/gtk1/textctrl.h
include/wx/msw/window.h
include/wx/window.h
src/gtk/textctrl.cpp
src/gtk1/textctrl.cpp
src/msw/window.cpp

index 43697c7b0f92034f1f13662efd9de4b476575133..4332f54142ff33dd3b18b6479faec66660e775eb 100644 (file)
@@ -1807,12 +1807,21 @@ implements the following methods:\par
 
 \membersection{wxWindow::ScrollLines}\label{wxwindowscrolllines}
 
-\func{virtual void}{ScrollLines}{\param{int }{lines}}
+\func{virtual bool}{ScrollLines}{\param{int }{lines}}
 
 Scrolls the window by the given number of lines down (if {\it lines} is
 positive) or up.
 
-This function is currently only implemented under MSW.
+\wxheading{Return value}
+
+Returns {\tt TRUE} if the window was scrolled, {\tt FALSE} if it was already
+on top/bottom and nothing was done.
+
+\wxheading{Remarks}
+
+This function is currently only implemented under MSW and wxTextCtrl under
+wxGTK (it also works for wxScrolledWindow derived classes under all
+platforms).
 
 \wxheading{See also}
 
@@ -1820,12 +1829,21 @@ This function is currently only implemented under MSW.
 
 \membersection{wxWindow::ScrollPages}\label{wxwindowscrollpages}
 
-\func{virtual void}{ScrollPages}{\param{int }{pages}}
+\func{virtual bool}{ScrollPages}{\param{int }{pages}}
 
 Scrolls the window by the given number of pages down (if {\it pages} is
 positive) or up.
 
-This function is currently only implemented under MSW.
+\wxheading{Return value}
+
+Returns {\tt TRUE} if the window was scrolled, {\tt FALSE} if it was already
+on top/bottom and nothing was done.
+
+\wxheading{Remarks}
+
+This function is currently only implemented under MSW and wxTextCtrl under
+wxGTK (it also works for wxScrolledWindow derived classes under all
+platforms).
 
 \wxheading{See also}
 
index bc5d527d11abefeefef5b95a87941bbe15a78e9b..085d5ca4b6ad0f717ff6220538671cd3181ec09c 100644 (file)
@@ -148,6 +148,10 @@ public:
     virtual void Freeze();
     virtual void Thaw();
 
+    // textctrl specific scrolling
+    virtual bool ScrollLines(int lines);
+    virtual bool ScrollPages(int pages);
+
     // wxGTK-specific: called recursively by Enable,
     // to give widgets an oppprtunity to correct their colours after they
     // have been changed by Enable
@@ -159,6 +163,13 @@ protected:
     // common part of all ctors
     void Init();
 
+    // get the vertical adjustment, if any, NULL otherwise
+    GtkAdjustment *GetVAdj() const;
+
+    // scroll the control by the given number of pixels, return true if the
+    // scroll position changed
+    bool DoScroll(GtkAdjustment *adj, int diff);
+
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
index bc5d527d11abefeefef5b95a87941bbe15a78e9b..085d5ca4b6ad0f717ff6220538671cd3181ec09c 100644 (file)
@@ -148,6 +148,10 @@ public:
     virtual void Freeze();
     virtual void Thaw();
 
+    // textctrl specific scrolling
+    virtual bool ScrollLines(int lines);
+    virtual bool ScrollPages(int pages);
+
     // wxGTK-specific: called recursively by Enable,
     // to give widgets an oppprtunity to correct their colours after they
     // have been changed by Enable
@@ -159,6 +163,13 @@ protected:
     // common part of all ctors
     void Init();
 
+    // get the vertical adjustment, if any, NULL otherwise
+    GtkAdjustment *GetVAdj() const;
+
+    // scroll the control by the given number of pixels, return true if the
+    // scroll position changed
+    bool DoScroll(GtkAdjustment *adj, int diff);
+
 private:
     // change the font for everything in this control
     void ChangeFontGlobally();
index 6e654f53f1a6c45f9d7146509c029697849d65e4..27432a415d7c5436bd70592013e5cd0ba353bbe9 100644 (file)
@@ -118,8 +118,8 @@ public:
     virtual void ScrollWindow( int dx, int dy,
                                const wxRect* rect = (wxRect *) NULL );
 
-    virtual void ScrollLines(int lines);
-    virtual void ScrollPages(int pages);
+    virtual bool ScrollLines(int lines);
+    virtual bool ScrollPages(int pages);
 
 #if wxUSE_DRAG_AND_DROP
     virtual void SetDropTarget( wxDropTarget *dropTarget );
index f1534578e3b01b425189a9f8a793844ece7f28b9..3f453930d61ce8afe94eb8e8716dfefe636af7b7 100644 (file)
@@ -664,13 +664,16 @@ public:
                                const wxRect* rect = (wxRect *) NULL ) = 0;
 
         // scrolls window by line/page: note that not all controls support this
-    virtual void ScrollLines(int WXUNUSED(lines)) { }
-    virtual void ScrollPages(int WXUNUSED(pages)) { }
-
-    void LineUp() { ScrollLines(-1); }
-    void LineDown() { ScrollLines(1); }
-    void PageUp() { ScrollPages(-1); }
-    void PageDown() { ScrollPages(1); }
+        //
+        // return TRUE if the position changed, FALSE otherwise
+    virtual bool ScrollLines(int WXUNUSED(lines)) { return FALSE; }
+    virtual bool ScrollPages(int WXUNUSED(pages)) { return FALSE; }
+
+        // convenient wrappers for ScrollLines/Pages
+    bool LineUp() { return ScrollLines(-1); }
+    bool LineDown() { return ScrollLines(1); }
+    bool PageUp() { return ScrollPages(-1); }
+    bool PageDown() { return ScrollPages(1); }
 
     // context-sensitive help
     // ----------------------
index 23abc60f42397fae0b1a382dd5f662542c3e0f3a..05ccf01a77b443d725d828481a304a9cb29302bb 100644 (file)
@@ -1296,6 +1296,10 @@ wxSize wxTextCtrl::DoGetBestSize() const
     return wxSize(80, ret.y);
 }
 
+// ----------------------------------------------------------------------------
+// freeze/thaw
+// ----------------------------------------------------------------------------
+
 void wxTextCtrl::Freeze()
 {
     if ( HasFlag(wxTE_MULTILINE) )
@@ -1311,3 +1315,59 @@ void wxTextCtrl::Thaw()
         gtk_text_thaw(GTK_TEXT(m_text));
     }
 }
+
+// ----------------------------------------------------------------------------
+// scrolling
+// ----------------------------------------------------------------------------
+
+GtkAdjustment *wxTextCtrl::GetVAdj() const
+{
+    return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL;
+}
+
+bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
+{
+    float value = adj->value + diff;
+
+    if ( value < 0 )
+        value = 0;
+
+    float upper = adj->upper - adj->page_size;
+    if ( value > upper )
+        value = upper;
+
+    // did we noticeably change the scroll position?
+    if ( fabs(adj->value - value) < 0.2 )
+    {
+        // well, this is what Robert does in wxScrollBar, so it must be good...
+        return FALSE;
+    }
+
+    adj->value = value;
+
+    gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed");
+
+    return TRUE;
+}
+
+bool wxTextCtrl::ScrollLines(int lines)
+{
+    GtkAdjustment *adj = GetVAdj();
+    if ( !adj )
+        return FALSE;
+
+    // this is hardcoded to 10 in GTK+ 1.2 (great idea)
+    static const int KEY_SCROLL_PIXELS = 10;
+
+    return DoScroll(adj, lines*KEY_SCROLL_PIXELS);
+}
+
+bool wxTextCtrl::ScrollPages(int pages)
+{
+    GtkAdjustment *adj = GetVAdj();
+    if ( !adj )
+        return FALSE;
+
+    return DoScroll(adj, pages*adj->page_increment);
+}
+
index 23abc60f42397fae0b1a382dd5f662542c3e0f3a..05ccf01a77b443d725d828481a304a9cb29302bb 100644 (file)
@@ -1296,6 +1296,10 @@ wxSize wxTextCtrl::DoGetBestSize() const
     return wxSize(80, ret.y);
 }
 
+// ----------------------------------------------------------------------------
+// freeze/thaw
+// ----------------------------------------------------------------------------
+
 void wxTextCtrl::Freeze()
 {
     if ( HasFlag(wxTE_MULTILINE) )
@@ -1311,3 +1315,59 @@ void wxTextCtrl::Thaw()
         gtk_text_thaw(GTK_TEXT(m_text));
     }
 }
+
+// ----------------------------------------------------------------------------
+// scrolling
+// ----------------------------------------------------------------------------
+
+GtkAdjustment *wxTextCtrl::GetVAdj() const
+{
+    return HasFlag(wxTE_MULTILINE) ? GTK_TEXT(m_text)->vadj : NULL;
+}
+
+bool wxTextCtrl::DoScroll(GtkAdjustment *adj, int diff)
+{
+    float value = adj->value + diff;
+
+    if ( value < 0 )
+        value = 0;
+
+    float upper = adj->upper - adj->page_size;
+    if ( value > upper )
+        value = upper;
+
+    // did we noticeably change the scroll position?
+    if ( fabs(adj->value - value) < 0.2 )
+    {
+        // well, this is what Robert does in wxScrollBar, so it must be good...
+        return FALSE;
+    }
+
+    adj->value = value;
+
+    gtk_signal_emit_by_name(GTK_OBJECT(adj), "value_changed");
+
+    return TRUE;
+}
+
+bool wxTextCtrl::ScrollLines(int lines)
+{
+    GtkAdjustment *adj = GetVAdj();
+    if ( !adj )
+        return FALSE;
+
+    // this is hardcoded to 10 in GTK+ 1.2 (great idea)
+    static const int KEY_SCROLL_PIXELS = 10;
+
+    return DoScroll(adj, lines*KEY_SCROLL_PIXELS);
+}
+
+bool wxTextCtrl::ScrollPages(int pages)
+{
+    GtkAdjustment *adj = GetVAdj();
+    if ( !adj )
+        return FALSE;
+
+    return DoScroll(adj, pages*adj->page_increment);
+}
+
index b3a276a34a3967c3fd63985e7fbefd4eef8e4734..989cf2021bdab01072eb4612db4a0a3580f76993 100644 (file)
@@ -770,6 +770,15 @@ int wxWindowMSW::GetScrollPage(int orient) const
 
 #endif // WXWIN_COMPATIBILITY
 
+inline int GetScrollPosition(HWND hWnd, int wOrient)
+{
+#ifdef __WXMICROWIN__
+    return ::GetScrollPosWX(hWnd, wOrient);
+#else
+    return ::GetScrollPos(hWnd, wOrient);
+#endif
+}
+
 int wxWindowMSW::GetScrollPos(int orient) const
 {
     int wOrient;
@@ -777,17 +786,11 @@ int wxWindowMSW::GetScrollPos(int orient) const
         wOrient = SB_HORZ;
     else
         wOrient = SB_VERT;
+
     HWND hWnd = GetHwnd();
-    if ( hWnd )
-    {
-#ifdef __WXMICROWIN__
-        return ::GetScrollPosWX(hWnd, wOrient);
-#else
-        return ::GetScrollPos(hWnd, wOrient);
-#endif
-    }
-    else
-        return 0;
+    wxCHECK_MSG( hWnd, 0, _T("no HWND in GetScrollPos") );
+
+    return GetScrollPosition(hWnd, wOrient);
 }
 
 // This now returns the whole range, not just the number
@@ -940,30 +943,44 @@ void wxWindowMSW::ScrollWindow(int dx, int dy, const wxRect *prect)
     ::ScrollWindow(GetHwnd(), dx, dy, prect ? &rect : NULL, NULL);
 }
 
-static void ScrollVertically(HWND hwnd, int kind, int count)
+static bool ScrollVertically(HWND hwnd, int kind, int count)
 {
+    int posStart = GetScrollPosition(hwnd, SB_VERT);
+
+    int pos = posStart;
     for ( int n = 0; n < count; n++ )
     {
         ::SendMessage(hwnd, WM_VSCROLL, kind, 0);
+
+        int posNew = GetScrollPosition(hwnd, SB_VERT);
+        if ( posNew == pos )
+        {
+            // don't bother to continue, we're already at top/bottom
+            break;
+        }
+
+        pos = posNew;
     }
+
+    return pos != posStart;
 }
 
-void wxWindowMSW::ScrollLines(int lines)
+bool wxWindowMSW::ScrollLines(int lines)
 {
     bool down = lines > 0;
 
-    ScrollVertically(GetHwnd(),
-                     down ? SB_LINEDOWN : SB_LINEUP,
-                     down ? lines : -lines);
+    return ScrollVertically(GetHwnd(),
+                            down ? SB_LINEDOWN : SB_LINEUP,
+                            down ? lines : -lines);
 }
 
-void wxWindowMSW::ScrollPages(int pages)
+bool wxWindowMSW::ScrollPages(int pages)
 {
     bool down = pages > 0;
 
-    ScrollVertically(GetHwnd(),
-                     down ? SB_PAGEDOWN : SB_PAGEUP,
-                     down ? pages : -pages);
+    return ScrollVertically(GetHwnd(),
+                            down ? SB_PAGEDOWN : SB_PAGEUP,
+                            down ? pages : -pages);
 }
 
 // ---------------------------------------------------------------------------